処理のための表の準備

Db2 z/OSのOracle GoldenGate環境で使用するために表を準備するには、次のタスクを実行する必要があります。

トリガーおよびカスケード制約の無効化

ターゲット表のトリガー、カスケード削除制約、カスケード更新制約を無効にするか、これらを変更してOracle GoldenGateデータベース・ユーザーによる変更が無視されるようにします。Oracle GoldenGateでは、トリガーまたはカスケード制約の結果として生成されるDMLがレプリケートされます。同じトリガーや制約がターゲット表でアクティブになった場合、レプリケートされたバージョンのために重複となり、データベースでエラーが返されます。ソース表にemp_srcsalary_src、ターゲット表にemp_targsalary_targを使用している次の例について考えます。

  • emp_srcに削除が発行されます。
  • それによって、削除がsalary_srcにカスケードされます。
  • Oracle GoldenGateが、両方の削除をターゲットに送信します。
  • 親削除が最初に到達し、emp_targに適用されます。
  • 親削除によって、削除がsalary_targにカスケードされます。
  • salary_srcのカスケードされた削除が、salary_targに適用されます。
  • 行はステップ5で削除され、見つかりません。

表における行の一意性の保証

Oracle GoldenGateでは、レプリケートされた更新および削除に対して正しいターゲット行を見つけるために、ソース表とターゲット表に一意の行識別子が必要です。

TABLE文またはMAP文にKEYCOLS句が存在しない場合、Oracle GoldenGateは、使用する行識別子を次の優先順位に従って選択します。

  1. 主キー

  2. タイムスタンプまたはマテリアライズされていない計算結果列を含まない英数字順で最初の一意キー。

  3. 前述のキー・タイプのいずれも存在しない場合(他のタイプのキーが表に定義されている場合でも)、Oracle GoldenGateは、データベースで一意キーでの使用を許可されているすべての列(キー内での使用がOracle GoldenGateでサポートされていない列やOracle GoldenGate構成から除外されている列は除く)で疑似キーを作成します。

    ノート:

    表に使用可能な他のキーが存在する場合や、表にキーがない場合、Oracle GoldenGateは、適切なメッセージをレポート・ファイルに記録します。すべての列からキーを作成すると、ソース・システムのOracle GoldenGateのパフォーマンスが低下します。ターゲットでは、このキーはReplicatでより広範囲で非効率なWHERE句が使用される原因となります。

  4. 表に適切なキーがない場合、あるいは既存のキーを使用しない場合は、表に一意の値が常に含まれる列があれば、代替キーを定義できます。ExtractのTABLEパラメータおよびReplicatのMAPパラメータ内にKEYCOLS句を含めることで、この代替キーを定義します。指定したキーにより、Oracle GoldenGateで検出される既存の主キーまたは一意キーはオーバーライドされます。Oracle GoldenGateリファレンスTABLE | MAPを参照してください。

KEYCOLSを使用したカスタム・キーの指定

前述のキー・タイプの行識別子が表に存在しないか、または、それらの識別子を使用しない場合は、常に一意の値が含まれている列が表にあれば、代替キーを定義できます。ExtractのTABLEパラメータおよびReplicatのMAPパラメータ内にKEYCOLS句を含めることで、この代替キーを定義します。指定したキーにより、Oracle GoldenGateで検出される既存の主キーまたは一意キーはオーバーライドされます。詳細は、『Oracle GoldenGateリファレンス』を参照してください。

ROWID列を含む表の処理

ROWID GENERATED ALWAYS(デフォルト)のデータ型の列を含むターゲット表に挿入しようとすると、次のODBCエラーで失敗します。

ODBC error: SQLSTATE 428C9 native database error -798. {DB2 FOR OS/390}{ODBC DRIVER}{DSN08015} DSNT408I SQLCODE = -798, ERROR: YOU CANNOT INSERT A VALUE INTO A COLUMN THAT IS DEFINED WITH THE OPTION GENERATED ALWAYS. COLUMN NAME ROWIDCOL.

次のいずれかを行って、ROWID列を含む表がOracle GoldenGateによって処理されるように準備します。

  • ターゲット表のROWID列がGENERATED BY DEFAULTとして定義されていることを確認します。

  • 表定義を変更できない場合、次の手順を使用して回避します。

ROWID GENERATE ALWAYSを回避する手順:

  1. ソース表に対するExtract TABLE文を作成し、その文で、ROWID列を除外するCOLSEXCEPT句を使用します。たとえば:

    TABLE tab1, COLSEXCEPT (rowidcol);

    COLSEXCEPT句で、ROWID列が取得されてターゲット表にレプリケートされないようにします。

  2. ターゲット表では、ReplicatがROWIDをキーとして使用しないようにします。これは、次のいずれかの方法で行えます。

    • ターゲット表定義で主キーを指定します。

    • キーを作成できない場合、表に対するReplicat MAPパラメータを作成し、その文にKEYCOLS句を使用してROWID列以外の一意の列を含めます。Replicatは、それらの列をキーとして使用します。たとえば:

      MAP tab1, TARGET tab1, KEYCOLS (num, ckey);