sqlLiteralSubstitution プロパティー

同じ構文を共有し、含まれているリテラル値のみが異なる多くの SQL ステートメントをアプリケーションで実行する場合には、 リテラル値に pureQuery 置換パラメーター・マーカーを使用することで、それらのステートメントを取り込んで統合できます。そうすることにより、アプリケーションでこれらの SQL ステートメントを静的に実行することができ、静的 SQL のセキュリティーおよび速度における利点を享受できます。

例えば、アプリケーションで、構文的には同じであるが、ユーザーがフォームのフィールド に指定したリテラル値が含まれる INSERT ステートメントを生成するような場合があります。

通常、これらのステートメントは、実行時に生成されるため、静的に実行できません。ただし、pureQuery のクライアント最適化では、SQL ステートメントの構文が、既にキャプチャーされているステートメントの構文と同じである場合に、リテラル値をパラメーター・マーカーに置き換えて認識することにより、このようなステートメントをキャプチャーすることができます。よって、これらの SQL ステートメントを DB2® パッケージにバインドすることができます。

クライアント最適化プロパティー executionModeSTATIC に設定してアプリケーションを実行すると、pureQuery は SQL ステートメントを、既にキャプチャーされているパラメーター化された SQL ステートメントと突き合わせます。 一致したステートメントは静的に実行されます。一致したステートメントはデータベースで実行されます。

ご使用のアプリケーションが SQL ステートメントを動的に実行する場合は、パラメーター・マーカーで置き換えられたリテラルを使用して、 キャプチャーされたステートメントのみを実行するというセキュリティー面の利点があります。 pureQuery Runtime プロパティー capturedOnly の値を TRUE に設定してください。

トピック内のセクション

SQL ステートメントをキャプチャーする前にクライアント最適化プロパティーを設定する場合には、以下の例のように sqlLiteralSubstitution プロパティーを ENABLE に設定します。

pdqProperties=captureMode (ON), executionMode (DYNAMIC), 
pureQueryXml	(C:/workspace/capture_file.pdqxml), 
sqlLiteralSubstitution (ENABLE)

アプリケーションで、次の例の最初のステートメントのような INSERT ステートメントを実行すると、pureQuery は、そのステートメントを次の例の 2 番目のステートメントの形式でキャプチャーします。

insert into EMPLOYEES/*inserting new row into EMPLOYEES table*/values('Dong','Margaret',NULL,60000,12)

insert into EMPLOYEES values(?,?,?,?,?)
注: CLI アプリケーション環境では、NULL はパラメーター・マーカーでは置き換えられず、SQL ステートメント内のコメントは削除されません。

ステートメントのキャプチャーが終了した後で、Configure ユーティリティーを capture_file.pdqxml ファイルに対して実行してから StaticBinder ユーティリティーを実行すれば、そのステートメントを DB2 パッケージにバインドできます。

executionMode プロパティーの値を STATIC に設定してアプリケーションを実行したときに、 そのアプリケーションがステートメント insert into EMPLOYEES values('Hinkis','Tali','R',68000,20)) を 発行すると、pureQuery はそのステートメントを、pureQueryXML ファイル内でパラメーター化されたバージョンと突き合わせて、 そのステートメントを静的に実行します。

ただし、SQL ステートメントを、capture_file.pdqxml ファイル内でパラメーター化されたステートメントと突き合わせないように pureQuery に 指示できます。 アプリケーションの実行前に、executionMode を STATIC に設定するときに、sqlLiteralSubstitution を DISABLE に 設定することもできます。 アプリケーションを実行したときに、そのアプリケーションが、上記の段落にある INSERT ステートメントを発行した 場合、pureQuery がそのステートメントを実行するかどうかは、 クライアント最適化プロパティー capturedOnly および allowDynamicSQL の値によって異なります。

sqlLiteralSubstitution プロパティーの値の設定

次の 表は、sqlLiteralSubstitution プロパティーの 3 つの値と、SQL ステートメントをキャプチャーしたときのそれらプロパティーの結果を リストしたものです。 表には、このプロパティー の値を設定しない場合の結果についても示されています。

表 1. sqlLiteralSubstitution プロパティーの値を設定した場合または設定しない場合の結果
初めてステートメントをキャプチャーする場合の結果 インクリメンタル・キャプチャーの場合の結果 STATIC モードまたは DYNAMIC モードのいずれかでアプリケーションを実行した場合の結果
ENABLE pureQuery は、リテラル値をパラメーター・マーカーに置き換えます。

さらに、pureQuery は、元の SQL ステートメント のスタック・トレースをキャプチャーします。pureQuery で元の SQL ステートメントすべてのスタック・トレースをキャプチャーする場合は、maxStackTracesCaptured プロパティーの値を増やす必要が生じることがあります。1

pureQuery は、元の SQL ステートメントを maxNonParmSQL プロパティーの値には計上しません。

ログ・レベルが FINE または FINER のときに pureQuery が SQL ステートメントをパラメーター化できない場合は、 警告メッセージがログに記録されます。 ログに記録される警告メッセージについては、『SQL リテラル置換』を参照してください。
結果は、初めて SQL ステートメントをキャプチャーする場合と同じです。 pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとします。 2
DISABLE pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとしません。
NOT_SET (または、指定しない) pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 pureQuery が指定の pureQueryXML ファイル内のステートメントを前回キャプチャーしたときの値が ENABLE だった 場合、pureQuery は、可能であればリテラル値をパラメーター・マーカーで置き換えます。

値が DISABLE または NOT_SET だった場合、pureQuery はリテラル値をパラメーター・マーカーで置き換えることはしません。
指定した pureQueryXML ファイル内のステートメントを pureQuery が前回取り込んだときの値が ENABLE であった場合には、pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとします。

値が DISABLE または NOT_SET だった場合、pureQuery は、アプリケーションが実行しようとする SQL ステートメントを、pureQueryXML ファイル内で パラメーター化された SQL ステートメントと突き合わせようとはしません。
注:
  1. プロパティー maxStackTracesCaptured およびスタック・トレースは、CLI アプリケーション環境ではサポートされていません。
  2. pureQuery Runtime が、pureQueryXML ファイル内でパラメーター化された SQL ステートメントを突き合わせることができない 場合、pureQuery Runtime の動作は captureMode プロパティーの値によって異なります。
    • captureMode の値が ON のときに、SQL ステートメントに対してリテラル置換が サポートされていると pureQuery Runtime が判断した場合、pureQuery は、パラメーター化された SQL ステートメントを実行してキャプチャーします。
    • captureMode の値が OFF の場合、pureQuery Runtime は、pureQueryXML ファイル内で 元の (パラメーター化されていない) SQL ステートメントを検索します。 pureQuery Runtime は、ステートメントを実行するか、または例外をスローします。 pureQuery アクションは、ファイル内でステートメントが検出されるかどうかによって、 および pureQuery Runtime プロパティー allowDynamicSQLcapturedOnly の値によって異なります。

    pureQueryXML ファイルを指定せずに SQL ステートメント・リテラル置換を有効にした場合、pureQuery Runtime は ステートメントの実行前に SQL ステートメント内のリテラル値をパラメーター・マーカーで置き換えます。 SQL ステートメントをキャプチャーして pureQueryXML ファイルを作成する必要はありません。 ステートメントは動的に実行されるため、静的に実行する必要はありません。 ただし、capturedOnlyexecutionMode など、pureQueryXML ファイルを必要とする 他の pureQuery Runtime オプションは有効にできません。

キャスト

pureQuery Runtime のバージョン 2.2.0.1 以降で、リテラル値をパラメーター・マーカーに置き換える際に 2 種類のキャストがサポートされるようになりました。

CAST 関数におけるいずれのパラメーターについても、SQL リテラル置換は CLI アプリケーション環境ではサポートされていません。

CAST 関数
SQL ステートメントが CAST 関数を使用してリテラル値をデータ・タイプにキャストする際、pureQuery はその値をパラメーター・マーカーに置き換えます。

例えば、ステートメントに節 WHERE mySMALLINTcolumn=CAST(99 as INTEGER), the value 99 が含まれている場合、そのステートメントがキャプチャーされると、 値 99 がパラメーター・マーカーになります。

別の例として、CAST 関数 CAST(6 as DECIMAL(7,3)) を使用する場合、ステートメントがキャプチャーされると、6 のみがパラメーター・マーカーになります。

CAST という名前のユーザー定義外部スカラー関数はサポートされません。

暗黙的キャスト
pureQuery Runtime は、ストリングと日時定数の間で暗黙的キャストを実行します。
ストリングから日時定数への変換
INSERT INTO DEPARTMENT VALUES(1,5,56,'000010','A00','aa','2008-09-09')

pureQuery Runtime は、 他のタイプの暗黙的キャストを実行しません。

SQL リテラル置換

DB2 CLI および IBM Data Server Driver の使用上の注意

DB2 コール・レベル・インターフェースまたは IBM Data Server Driver と pureQuery Runtime を一緒に使用する場合は、pureQuery Runtime プロパティーを構成キーワードとして使用できます。

IBM CLI キーワードの構文
sqlLiteralSubstitution = ENABLE | DISABLE | NOT_SET
IBM Data Server Driver 構成の構文
<parameter name="sqlLiteralSubstitution" value="ENABLE | DISABLE | NOT_SET" />
同等の IBM Data Server Provider for .NET 接続ストリング・キーワード
該当なし

pureQueryXML ファイルなしで SQL リテラル置換を有効にする

pureQueryXML ファイルを指定せずに SQL リテラル置換を有効にできます。 SQL ステートメントをキャプチャーして pureQueryXML ファイルを作成する必要はありません。 ステートメントは動的に実行されるため、静的に実行する必要はありません。

次の db2dsdriver.cfg 構成ファイルの例では、sqlLiteralSubstitution キーワードが 有効にされていて、pureQueryXml キーワードは使用されていません。
<configuration>
  <dsncollection>
    <dsn alias="sample",name="sample",host="server1.test.com", port="50001">
      <parameter name="sqlLiteralSubstitution", value="ENABLE"/>
    </dsn>
  </dsncollection>
  <databases>
    <database name="sample", host=" server1.test.com", port="50001">
    </database>
  </databases>
</configuration>
pureQuery クライアント最適化対応の CLI アプリケーションの場合、pureQuery Runtime は、 ステートメントの動的な実行を試行する前に、SQL ステートメント内のリテラル値をパラメーター・マーカーで置き換えます。

フィードバック