SQL クエリ方式

ポリシー サーバは SQL クエリ方式を使用して、リレーショナル データベースでユーザ データを検索するクエリを作成します。[SQL クエリ方式]ダイアログ ボックスを使用して、SQL クエリ方式を作成および編集します。
casso127jpjp
ポリシー サーバは SQL クエリ方式を使用して、リレーショナル データベースでユーザ データを検索するクエリを作成します。[SQL クエリ方式]ダイアログ ボックスを使用して、SQL クエリ方式を作成および編集します。
2
注:
列名のプレフィックスである「SM_」は、特殊名のために予約されています。ユーザ ディレクトリの列名の先頭には、「SM_」というプレフィックスを使用しないでください。
SQL クエリ方式の設定
ユーザ ストア リレーショナル データベースでユーザ データを検索する SQL クエリ方式を設定します。
以下の手順に従います。
  1. [インフラストラクチャ]-[ディレクトリ]をクリックします。
  2. [SQL クエリ方式]をクリックします。
  3. [SQL クエリ方式の作成]をクリックします。
  4. [オブジェクトの新規作成]オプションが選択されていることを確認し、[OK]をクリックします。
  5. [一般]領域のフィールドに名前および説明を入力します。
  6. 使用しているデータベース スキーマに合わせて、クエリ フィールドの内容を更新します。
    リレーショナル データベースを使用するには、各クエリを設定します。そのためには、以下のデータベース テーブル名および列名を、使用しているリレーショナル データベースにある名前と置き換えます。
    • 名前
      ユーザの Name パラメータは一意です。
    • SmUser—table
    • SmGroup—table
    • Password
    • SmUserGroup—table
    • ID
    • UserID
    • FirstName
    • LastName
    • TelephoneNumber
    • EmailAddress
    • Mileage
    • PIN
    • GroupID
    • Disabled (無効)
  7. クエリ タイプを選択し、[サブミット]をクリックします。
    クエリが保存されました。クエリ方式をユーザ ディレクトリ接続に関連付けることができます。
  8. ポリシー サーバを再起動します。
ODBC ユーザ ディレクトリ接続への SQL クエリ方式の追加
[ユーザ ディレクトリ]ダイアログ ボックスを使用して、SQL クエリ方式を選択します。
以下の手順に従います。
  1. 既存のユーザ ディレクトリ接続オブジェクトに対する[ユーザ ディレクトリ]ペインを開きます。
  2. [SQL クエリ方式]リストから、SQL クエリ方式を選択して、[サブミット]をクリックします。
  3. ポリシー サーバの管理コンソールを使用して、ポリシー サーバを再起動します。
注:
クエリによってアポストロフィ文字を含む名前(O'Neil など)が返された場合は、クエリ文字列の '%s' インスタンスをすべて "%s" に置き換えてください。この問題を回避するには、アポストロフィを含まないユーザ ID に基づくクエリを作成するか、'%s' を含むクエリ文字列を変更します。
ストアド プロシージャを使用して認証するように SQL クエリ方式を設定する方法
ODBC ユーザ ディレクトリによる認証にストアド プロシージャが必要な場合は、ストアド プロシージャを呼び出すように SQL クエリ方式を設定します。データベース タイプに適切な構文を使用して、SQL クエリ方式を設定します。
注:
レコード セットの結果を返すストアド プロシージャを使用するには、"Procedures Return Results" を有効にします。これは、必ずしも EncryptPW ではありません。
 
SQL Server
構文:
Call
Procedure_Name
%s , %s
構文:
Call EncryptPW %s , %s
SQLServer のストアド プロシージャは、以下の要件を満たしている必要があります。
  • 最初のパラメータがユーザ名で、2 番目のパラメータがパスワードであること。
  • すべてのパラメータは、キーワード OUT を使用して定義すること。
  • ストアドプロシージャは整数値を返すこと。
以下の例に、SQLServer ユーザ ディレクトリのストアド プロシージャを作成する方法を示します。
CREATE PROCEDURE EncryptPW @UserName varchar(20) OUT , @PW varchar(20) OUT AS SELECT Smuser.name from Smuser where Smuser.name= @UserName and password = @PW SELECT Smuser.password from Smuser where name= @UserName and password = @PW return 0
MySQL
構文:
Call
Procedure_Name
%s, %s
例:
Call EncryptPW %s, %s
MySQL のストアド プロシージャは、以下の要件を満たしている必要があります。
  • 最初のパラメータがユーザ名で、2 番目のパラメータがパスワードであること。
  • ストアド プロシージャは値を返さないこと。
以下の例に、MySQL ユーザ ディレクトリのストアド プロシージャを作成する方法を示します。
DELIMITER// CREATE PROCEDURE EncryptPW(INOUT p_UserName varchar(20), INOUT p_PW varchar(20)) BEGIN SELECT SmUser.Name into p_UserName from test.SmUser where SmUser.Name = p_UserName and SmUser.Password = p_PW; SELECT SmUser.Password into p_PW from test.SmUser where SmUser.Name = p_UserName and SmUser.Password = p_PW; END; // DELIMITER;
Oracle の関数
構文:
Call
Procedure_Name
%s , %s
Oracle ユーザ ディレクトリでは、テンプレートを使用して、以下の関数を作成します。
  • EncryptPW
  • ChangePW
Oracle 関数内のストアド プロシージャは、以下の要件を満たしている必要があります。
  • 最初のパラメータがユーザ名で、2 番目のパラメータがパスワードであること。
EncryptPW 関数
EncryptPW 関数は、以下のように、整数値を返す必要があります。
  • ゼロの値は成功を指定します。
  • 1 の値は失敗を指定します。
以下のテンプレートを使用して、EncryptPW 関数を作成することができます。
CREATE OR REPLACE FUNCTION EncryptPW(p_UserName IN OUT SmUser.Name%type, p_PW IN OUT SmUser.Password%type) RETURN INTEGER IS nRet INTEGER :=1; nCount NUMBER := 0; BEGIN select count(*) into nCount from SmUser where SmUser.Name = p_UserName and SmUser.Password = p_PW; IF (nCount = 1) THEN SELECT SmUser.Name into p_UserName from SmUser where SmUser.Name = p_UserName and SmUser.Password = p_PW; SELECT SmUser.Password into p_PW from SmUser where SmUser.Name = p_UserName and SmUser.Password = p_PW; RETURN 0; END IF; RETURN nRet; END EncryptPW; /
ChangePW 関数
ChangePW 関数は、以下のように、整数値を返す必要があります。
  • 1 の値は成功を指定します。
  • ゼロの値は失敗を指定します。
以下のテンプレートを使用して、ChangePW 関数を作成することができます。
CREATE OR REPLACE FUNCTION ChangePW(p_PW IN SmUser.Password%type, p_UserName IN SmUser.Name%type) RETURN INTEGER IS nRet INTEGER :=1; nCount NUMBER := 0; BEGIN select count(*) into nCount from SmUser where SmUser.Name = p_UserName; IF (nCount = 1) THEN UPDATE SmUser SET SmUser.Password = p_PW where SmUser.Name = p_UserName; COMMIT; RETURN 0; END IF; END ChangePW; /
フェイルオーバーおよび接続プーリング時の非同期呼び出しの対応
同期呼び出しは、リクエストの処理が完了してから返されます。非同期呼び出しはただちに返されます。ネットワーク障害に伴う遅延を回避するために、呼び出し元は非同期呼び出しを放棄できます。
以下のデータベースに対して、非同期呼び出しを行うことができます。
  • SQLServer
  • Windows NT および Solaris 上の Oracle 8 ~ Oracle 11g
非同期呼び出し対応の設定
レジストリ サブキー Netegrity\SiteMinder\CurrentVersion\Database の下には、以下のようなレジストリ オプションが格納されています
  • AsynchronousCalls
    データベース コールが非同期で行われるかどうかを指定します。
    : 0 (no)、1(yes)
    デフォルト
    : 0
  • AsynchronousSleepTime
    呼び出しの間隔を指定します。この時間を過ぎても SQL 呼び出しが処理されない場合、ステータスがチェックされます。
    : 0 ~ n ミリ秒
    デフォルト
    : 15 ミリ秒
  • LoginTimeout
    データベースにログインするまでの許容時間。この時間を過ぎると、接続はタイムアウトします。
    : 最小で 1 秒
    デフォルト
    : 15 秒
  • QueryTimeout
    クエリの実行が完了するまでの時間。この時間を過ぎるとクエリは取り消されます。
    : 最小で 1 秒
    デフォルト
    : 15 秒
注:
Windows NT で動作する SQL Server の場合、非同期呼び出しを使用しても、生じるメモリ リークはわずかです。ネットワークが不安定な場合には、設定を調整してタイムアウトを延長し、フェイルオーバーの数を減らします。
ODBC 接続プーリング
以下の基準は ODBC 接続プーリングに関する説明です。
  • ODBC データ ソースは接続をプールします。複数のディレクトリがデータ ソースを使用する場合は、使用可能な接続の数がディレクトリおよびストアの合計に達することがあります。ポリシー ストアはデータ ソースを使用する必要があり、ポリシー サーバの上の別のストアはデータ ソースを使用する必要があります。
  • 接続の共有については、SQL Server は Oracle よりも制限を受けます。2 つの呼び出し元は 1 つの開いている結果セットを共有できません。同時アクティビティは制限できます(特にマルチプロセッサ マシンの場合)。接続数を増やせば、一般的に同時実行性が向上します。
  • Oracle では、複数の呼び出し元が 1 つの接続を共有できますが、呼び出しは内部的に直接化できます。
  • 接続を共有すると、アクティブ リクエストの数はプール内の接続の間で分散され、均衡化されます。
  • ポリシー サーバは、シャット ダウンするときに開いている接続を閉じます。