フィールド・プロシージャーを使用する列レベルの暗号化の提供

DB2 for i で、フィールド・プロシージャーは列レベルの暗号化を提供できます。

フィールド・プロシージャーは、単一列内の値を変換するユーザー作成の出口ルーチンです。 列内の値が変更されるか、または新しい値が挿入されると、フィールド・プロシージャーが各値に対して呼び出されます。 フィールド・プロシージャーは、その値を任意の方法で変換できます (それをエンコードします)。 その後、エンコードされた値が保管されます。 値が列から取り出されると、フィールド・プロシージャーはエンコードされた値ごとに呼び出されます。 フィールド・プロシージャーは、各値を元の値にデコードします。 フィールド・プロシージャーを使用する列に定義された索引は、エンコード値を使用して構築されます。

フィールド・プロシージャーは、CREATE TABLE および ALTER TABLE の FIELDPROC 文節によって、表に割り当てられます。

列に指定されたフィールド・プロシージャーは、以下の 3 つの一般的な状態のときに呼び出されます。

  • フィールド定義の場合、プロシージャー名を指定した CREATE TABLE または ALTER TABLE ステートメントが実行されるとき。 この呼び出しの際に、プロシージャーは以下を行います。
    • 列のデータ・タイプおよび属性が有効かどうかを判別します。
    • リテラル・リストを検査して、必要であればそれを変更します。
    • 列のフィールド記述を提供します。
  • フィールド・エンコードの場合、列値がフィールド・エンコードされているとき。 これは、以下の値に対して生じます。
    • SQL INSERT ステートメント、SQL MERGE ステートメント、またはネイティブ書き込みによって列に挿入された値。
    • SQL UPDATE ステートメント、SQL MERGE ステートメント、またはネイティブ更新によって変更された値。
    • フィールド・プロシージャーが関連付けられた列からのコピーでの、ターゲット列の値。 フィールド・プロシージャーは、コピーされたデータをエンコードするために呼び出されることがあります。 その例として、SQL ステートメントの ALTER TABLE または CREATE TABLE LIKE/AS、および CL コマンドの CPYF と RGZPFM があります。
    • フィールド・プロシージャーのある列と比較される値。 QAQQINI オプションの FIELDPROC_ENCODED_COMPARISON は、列値がデコードされているか、またはホスト変数、定数、結合列がエンコードされているかを判別するために使用されます。
    • CREATE または ALTER TABLE ステートメントで、フィールド・プロシージャーの関連付けられた列の DEFAULT 値。

    after または read トリガーがある場合、フィールド・プロシージャーはそれらのトリガーの前に 呼び出されます。 before トリガーがある場合、フィールド・プロシージャーはその before トリガーの後に 呼び出されます。

  • フィールド・デコードの場合、保管された値がフィールド・デコードされて元の値に戻されるとき。 フィールド・デコードは、以下の値に対して生じます。
    • SQL SELECT または FETCH ステートメント、またはネイティブ読み取りによって取り出される値。
    • コピーされる、フィールド・プロシージャーが関連付けられた列の値。 フィールド・プロシージャーは、コピーを行う前にデータをデコードするために呼び出されることがあります。 その例として、SQL ステートメントの ALTER TABLE、CREATE TABLE LIKE/AS、および CL コマンドの CPYF と RGZPFM があります。
    • フィールド・プロシージャーのある列と比較される値。 QAQQINI オプションの FIELDPROC_ENCODED_COMPARISON は、列値がデコードされているか、またはホスト変数や定数がエンコードされているかを判別するために、最適化プログラムによって使用されます。

    フィールド・プロシージャーが、NULL 値を処理するために呼び出されることはありません。 また、表に DELETE トリガーがないとき、WHERE 文節のない DELETE 操作のために呼び出されることもありません。 フィールド・プロシージャーは、空ストリングに対して呼び出されます。

パフォーマンスの向上

フィールド・プロシージャーを使用する照会では、フィールド・プロシージャーを呼び出す追加処理のために、パスの長さがより長くなります。 照会のパフォーマンスを改善するために、SQE 最適化プログラムは以下を行います。

  • QAQQINI FIELDPROC_ENCODED COMPARISON 設定に基づいて、デコード操作の除去を試行します。
  • フィールド・プロシージャーが関連付けられた列に対する既存の索引を突き合わせます。
  • フィールド・プロシージャーのある列に対する MTI を作成して使用します。
  • 統計収集によって、エンコードされた値に対する統計を作成します。

SQE 最適化プログラムは、以下の最適化を試行します。

  • フィールド・プロシージャー列と定数またはホスト変数とを比較する述部の最適化。 例えば、述部 FP1(4, C1) = 'abc' は C1 = FP1(0, 'abc') として最適化されます。 この特定の例では、QAQQINI オプションが *NONE ではない限り最適化が行われます。
  • 同じフィールド・プロシージャーが結合述部の両側に適用され、互換性のための変換は必要ない場合に、フィールド・プロシージャーのデコード操作を結合述部から除去します。 例えば、結合述部 FP1(4,T1.C1) > FP1(4,T2.C1) は、T1.C1 > T2.C1 と書き換えられます。 この特定の例では、QAQQINI オプションが *ALLOW_RANGE または *ALL のどちらかである限り最適化が行われます。 この技法は、QAQQINI オプションが *ALLOW_EQUAL のとき、= 述部にも適用されます。
  • フィールド・プロシージャーを GROUP BY および ORDER BY 文節から除去します。 例えば、QAQQINI 設定が *ALLOW_RANGE または *ALL のどちらかである場合、ORDER BY FP1(4,C1) は ORDER BY C1 と書き換えられます。

CQE 最適化プログラムは QAQQINI オプションを無視するので、常に *NONE モードで実行します。 *NONE モードでは、他のいずれかの操作が実行される前に、列に対するすべての参照がデコードされることが必要です。 CQE 照会は、列にフィールド・プロシージャーが関連付けられているとき、既存のどの索引に対してもマッチングしません。 索引が必要な場合、索引キーがデコードされた一時索引が構築されます。