PL/SQLコードによるフィルタ
この方法は、トリガーベースのキャプチャでのみ有効です。
PL/SQLコードを記述して、DDLをExtractに渡すかどうかを判断する関数にDDLに関する情報を渡します。Extractに送信するDDL操作を少なくすることでキャプチャのパフォーマンスを向上させることができます。
- Oracle GoldenGateのインストール・ディレクトリにある
ddl_filter.sqlファイルを、これから記述するコードをテストできるテスト・マシンにコピーします。 - ファイルを編集用に開きます。
filterDDLという名前のPL/SQL関数が含まれており、これを変更してif/thenフィルタ基準を指定できます。この関数に渡される情報は、次のとおりです。-
ora_owner: DDLオブジェクトのスキーマ -
ora_name: オブジェクトの定義されている名前 -
ora_objtype: オブジェクトのタイプ(TABLE、INDEXなど) -
ora_optype: 操作のタイプ(CREATE、ALTERなど) -
ora_login_user: DDLを実行したユーザー -
retVal: Extractの処理にDDLを含める場合はINCLUDE。DDLを除外する場合はEXCLUDE。
'compute retVal here'コメントの後ろに、フィルタするDDLのタイプごとにフィルタ・コードを記述します。次に、例を示します。if ora_owner='SYS' then retVal:='EXCLUDE'; end if; if ora_objtype='USER' and ora_optype ='DROP' then retVal:='EXCLUDE'; end if; if ora_owner='JOE' and ora_name like 'TEMP%' then retVal:='EXCLUDE'; end if;
この例では、次のDDLが、DDLトリガーによる処理から除外されます。
-
SYSによって所有されているオブジェクトに対するDDL -
任意の
DROP USER -
JOE.TEMP%に対する任意のDDL
-
- (オプション)フィルタリングをトレースするには、PL/SQLの各
if/then文に次の構文を追加します。if ora_owner='JOE' and ora_name like 'TEMP%' then retVal:='EXCLUDE'; if "&gg_user" .DDLReplication.trace_level >= 1 then "&gg_user" .trace_put_line ('DDLFILTER', 'excluded JOE.TEMP%'); end if;説明:
-
&gg_userは、Oracle GoldenGate DDLサポート・オブジェクトのスキーマです。 -
.DDLReplication.trace_levelは、DDLトレースのレベルです。トリガー・トレースを使用するには、Extractパラメータ・ファイルでDDLまたはDDLONLYオプションを指定してTRACEまたはTRACE2パラメータを使用する必要があります。.DDLReplication.trace_levelパラメータを>=1に設定する必要があります。 -
trace_put_lineは、Extractがトレース・ファイルに書き込む、フィルタされたDDLのタイプを表すユーザー定義テキスト文字列です。
-
- コードを保存します。
- テスト・システムでDDLアクティビティを停止します。
- SQL*Plusで次のように
ddl_filter.sqlファイルをコンパイルします。ここで、schema_nameは、Oracle GoldenGate DDLオブジェクトがインストールされているスキーマです。@ddl_filter schema_name
- テスト環境でテストし、フィルタリングが機能することを確認します。コード内のエラーによってソースとターゲットのDDLが同期しなくなることがあるため、このテストを実行することは重要です。
- テストが成功したら、ファイルをソース本番システムのOracle GoldenGateのインストール・ディレクトリにコピーします。
- ソース・システムでDDLアクティビティを停止します。
- 前に行ったように
ddl_filter.sqlファイルをコンパイルします。@ddl_filter schema_name
- ソース・システムでDDLアクティビティを停止します。