処理のための表の準備
Db2 z/OSのOracle GoldenGate環境で使用するために表を準備するには、次のタスクを実行する必要があります。
トリガーおよびカスケード制約の無効化
ターゲット表のトリガー、カスケード削除制約およびカスケード更新制約を無効にするか、これらを変更してOracle GoldenGateデータベース・ユーザーによる変更を無視するように変更します。Oracle GoldenGateでは、トリガーまたはカスケード制約の結果として生じるDMLをレプリケートします。同じトリガーまたは制約がターゲット表でアクティブになった場合、レプリケートされたバージョンが原因で冗長になり、データベースによってエラーが返されます。ソース表にemp_srcとsalary_src、ターゲット表にemp_targとsalary_targを使用している次の例について考えます。
-
emp_srcに削除が発行されます。 -
それによって、削除が
salary_srcにカスケードされます。 -
Oracle GoldenGateが、両方の削除をターゲットに送信します。
-
親削除が最初に到達し、
emp_targに適用されます。 -
親削除は、削除を
salary_targにカスケードします。 -
salary_srcのカスケードされた削除が、salary_targに適用されます。 -
行はステップ5で削除され、見つかりません。
表における行の一意性の保証
Oracle GoldenGateでは、レプリケートされた更新および削除に対して正しいターゲット行を見つけるために、ソース表とターゲット表に一意の行識別子が必要です。
TABLE文またはMAP文にKEYCOLS句が存在しない場合、Oracle GoldenGateは、使用する行識別子を次の優先順位に従って選択します。
-
主キー
-
タイムスタンプまたはマテリアライズされていない計算結果列を含まない英数字順に最初の一意キー。
-
前述のキー・タイプのいずれも存在しない場合(他のタイプのキーが表に定義されている場合でも)、Oracle GoldenGateは、データベースで一意キーでの使用を許可されているすべての列(キー内での使用がOracle GoldenGateでサポートされていない列やOracle GoldenGate構成から除外されている列は除く)で疑似キーを作成します。
ノート:表に使用可能な他のキーの有無や、表にキーがない場合、Oracle GoldenGateは、適切なメッセージをレポート・ファイルに記録します。すべての列からキーを構築すると、ソース・システム上のOracle GoldenGateのパフォーマンスが妨げられます。ターゲットでは、このキーがReplicatでより広範囲で非効率なWHERE句が使用される原因となります。
- 表に適切なキーがない場合、または既存のキーを使用しない場合は、表に一意の値が常に含まれる列があれば、代替キーを定義できます。この代替キーを定義するには、Extractの
TABLEパラメータおよびReplicatのMAPパラメータ内にKEYCOLS句を含めます。指定されたキーにより、Oracle GoldenGateで検出される既存の主キーまたは一意キーがオーバーライドされます。Oracle GoldenGateリファレンスのTABLE | MAPを参照してください。
KEYCOLSを使用したカスタム・キーの指定
表に前述のタイプの行IDのいずれかがない場合、またはこれらの識別子を使用しない場合は、表に常に一意の値が含まれる列があるときは、代替キーを定義できます。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を回避する手順:
-
ソース表に対するExtract
TABLE文を作成し、その文で、ROWID列を除外するCOLSEXCEPT句を使用します。たとえば:TABLE tab1, COLSEXCEPT (rowidcol);COLSEXCEPT句で、ROWID列が取得されてターゲット表にレプリケートされないようにします。 -
ターゲット表では、Replicatが
ROWIDをキーとして使用しないようにします。これは、次のいずれかの方法で実行できます。-
ターゲット表定義で主キーを指定します。
-
キーを作成できない場合、表に対するReplicat
MAPパラメータを作成し、その文にKEYCOLS句を使用してROWID列以外の一意の列を含めます。Replicatは、それらの列をキーとして使用します。たとえば:MAP tab1, TARGET tab1, KEYCOLS (num, ckey);
-
マテリアライズ問合せ表の維持
ソースとターゲットのマテリアライズ問合せ表(MQT)間の同等性を維持するには、ベース表をレプリケートしますが、MQTはレプリケートしません。ターゲット・データベースでは、Replicatがベース表に適用する変更に基づいてMQTが維持されています。
これらの表を構成するためのルールを次に示します。
-
ベース表を
TABLEおよびMAP文に含めます。 -
MQTは
TABLEおよびMAP文に含めないでください。 -
TABLEおよびMAP文では、MQT名を通常の表名とともに解決できますが、ワイルドカードを使用できます。Oracle GoldenGateでは、MQTはワイルドカードを使用した表リストから自動的に除外されます。ただし、ExtractのTABLE文でMQTを名前によって明示的にリストすると、Extractが異常終了する原因となります。