11 非統合Replicatを使用するための追加の構成手順
この章は、「Oracle GoldenGateの適用の構成」に記載されている基本的な構成要件を補足するものです。
内容は次のとおりです。
- ターゲット表でのトリガーと参照カスケード制約の無効化
Replicatが非統合モードの場合、トリガーとカスケード制約をOracleターゲット表で無効にする必要があります。 - ターゲット表での制約チェックの延期
Replicatが非統合モードの場合、ターゲットで制約チェックを延期する必要がある場合があります。
ターゲット表でのトリガーと参照カスケード制約の無効化
Replicatが非統合モードの場合、トリガーとカスケード制約をOracleターゲット表で無効にする必要があります。
Oracle GoldenGateには、Oracleバージョンに応じてトリガーまたはカスケード制約を自動的に処理するオプションがいくつか用意されています。
-
Oracle 11.2.0.2以降の11gR2の各バージョンの場合、Replicatは、セッション中、トリガーによって行われる処理を無効にします。トリガーは無効になりませんが、かわりに、トリガー本体が実行されなくなります。ただし、トリガーの
WHEN
部分はコンパイルして実行し、データベース・エラーが起きないようにする必要があります。トリガーの起動を有効にするには、または手動で無効にするには、DBOPTIONS
のNOSUPPRESSTRIGGERS
オプションを使用して、USERIDALIAS
パラメータの後に文を配置します。特定のトリガーの起動を許可するには、次のデータベース・プロシージャを使用します。trigger_owner
はトリガーの所有者で、trigger_name
はトリガーの名前です。特定のトリガーに対してプロシージャがFALSE
でコールされると、そのプロシージャがTRUE
でコールされるまで設定されたままになります。 dbms_ddl.set_trigger_firing_property(
trigger_owner
"trigger_name
", FALSE)-
Oracle 11.2.0.2以降の11gR2の各バージョンの場合、
DEFERREFCONST
オプションを指定してDBOPTIONS
パラメータを使用し、Replicatトランザクションがコミットされるまで、カスケード更新およびカスケード削除の制約のチェックおよび強制を延期できます。 -
他のOracleのバージョンの場合、トリガーと整合性制約を無効にするか、それらを手動で変更して、Replicatデータベース・ユーザーを無視します。
Oracle GoldenGateでは、トリガーまたはカスケード制約の発生によって生じたDMLがレプリケートされるため、Replicatが非統合モードの場合は制約を無効にする必要があります。同じトリガーや制約がターゲット表でアクティブになった場合、レプリケートされたバージョンのために重複となり、データベースでエラーが返されます。ソース表にemp_src
とsalary_src
、ターゲット表にemp_targ
とsalary_targ
を使用している次の例について考えます。
-
emp_src
に対して削除が発行されます。 -
それによって、削除が
salary_src
にカスケードされます。 -
Oracle GoldenGateが、両方の削除をターゲットに送信します。
-
まず親削除が到着し、
emp_targ
に適用されます。 -
親削除によって、削除が
salary_targ
にカスケードされます。 -
salary_src
のカスケードされた削除が、salary_targ
に適用されます。 -
行は、すでに手順5で削除されているため、見つかりません。
親トピック: 非統合Replicatを使用するための追加の構成手順
ターゲット表での制約チェックの延期
Replicatが非統合モードの場合、ターゲットで制約チェックを延期する必要がある場合があります。
制約を遅延するには、次の手順を実行します。
この例では、キー値2がすでに表に存在するため、Replicatによって最初の更新がターゲットに適用されると、ORA-00001(一意制約)エラーになります。Replicatトランザクションによって制約違反エラーが返されます。デフォルトでは、Replicatによってそれらの違反および異常終了は処理されません。
11.2.0.2より前のバージョンでの一時的な主キーの重複の処理
11.2.0.2より前のバージョンで一時的な主キーの重複を処理するには、ReplicatパラメータHANDLETPKUPDATE
を使用します。この構成では、非統合Replicatは、制約を一時的に延期して一時的な主キーの更新を処理します。この機能をサポートするには、ターゲット表でDEFERRABLE INITIALLY IMMEDIATE
として制約を作成または変更する必要があります。制約がDEFERRABLE
でない場合、Replicatは、HANDLECOLLISIONS
およびREPERROR
パラメータを使用して指定されているルール(存在する場合)に従ってエラーを処理するか、異常終了します。
親トピック: ターゲット表での制約チェックの延期
11.2.0.2以降のバージョンでの一時的な主キーの重複の処理
11.2.0.2より後のバージョンの場合、非統合Replicatは、デフォルトではOracle Workspace Managerの作業領域を使用して一時的な主キーの重複を自動的に解決しようとします。この構成では、Replicatは、コミット時まで制約チェックを延期します。制約は、明示的に延期可能として定義されている必要はありません。
一時的な主キーの重複の自動処理の要件は、次のとおりです。
-
Replicatデータベース・ユーザーに次のOracle関数へのアクセス権を付与します。
DBMS_XSTREAM_GG.ENABLE_TDUP_WORKSPACE()
-
ターゲット表は延期可能な制約を持つことはできません。延期可能な制約がある場合、Replicatはエラーを返し、異常終了します。
延期可能な制約を持つ表を処理するには、制約がDEFERRABLE INITIALLY IMMEDIATE
であることを確認し、その表をマップするMAP
文でHANDLETPKUPDATE
パラメータを使用します。HANDLETPKUPDATE
パラメータでは、デフォルトである重複の自動処理がオーバーライドされます。作業領域の使用によって、次のOracle GoldenGateのエラー処理パラメータが影響を受けます。
-
HANDLECOLLISIONS
-
REPERROR
ReplicatによってOracle Workspace Managerの作業領域が有効になると、HANDLECOLLISIONS
、REPERROR
などのOracle GoldenGateパラメータで指定されたエラー処理が無視されます。かわりに、グループ化されたトランザクション(BATCHSQL
が有効な場合)がReplicatによって異常終了され、アクティブな作業領域を使用して通常のモードで更新が再試行されます。再度ORA-00001が発生する場合、Replicatでトランザクションがロールバックされ、有効なエラー処理ルールを使用してトランザクションが再試行されます。
注意:
非更新レコードに対してORA-00001が発生する場合、HANDLECOLLISIONS
、REPERROR
などのエラー処理のパラメータによってエラーが処理されます。
一時的な主キーの重複を含む操作に、LOBやXMLTypeなどの行外列の更新も含まれる場合、作業領域は使用できません。したがって、そのようなケースはサポートされず、ターゲットで未検出のデータの破損が発生する可能性があります。この例は、次のとおりです。
update T set PK = PK + 1, C_LOB = 'ABC';
親トピック: ターゲット表での制約チェックの延期