19 ルールベースの変換の管理
Oracle Streamsでのルールベースの変換は、ポジティブ・ルール・セットのルールがTRUEに評価される場合に行われるメッセージの変更を意味します。ルールベースの変換には、宣言とカスタムという2つのタイプがあります。
次の項では、ルールベースの変換の管理について説明します。
注意:
ルールがポジティブ・ルール・セットに含まれる場合にのみ、ルールに指定した変換が実行されます。ルールが取得プロセス、伝播、適用プロセスまたはメッセージ・クライアントのネガティブ・ルール・セットに含まれる場合、これらのOracle Streamsクライアントではルールベースの変換が無視されます。
関連項目:
19.1 宣言ルールベースの変換の管理
宣言ルールベースの変換を管理するには、DBMS_STREAMS_ADMパッケージのADD_COLUMN、DELETE_COLUMN、KEEP_COLUMNS、RENAME_COLUMN、RENAME_SCHEMAおよびRENAME_TABLEプロシージャを使用します。
この項では、次のタスクの実行手順を説明します。
19.1.1 宣言ルールベースの変換の追加
次の各項では、宣言ルールベースの変換をDMLルールに追加する例について説明します。
注意:
DMLルールに対してのみ宣言ルールベースの変換を指定できます。DDLルールには指定できません。
19.1.1.1 表名を変更する宣言ルールベースの変換の追加
DBMS_STREAMS_ADMパッケージのRENAME_TABLEプロシージャを使用して、行LCR内の表名を変更する宣言ルールベースの変換を追加します。たとえば、次のプロシージャを実行すると、strmadminスキーマのjobs12ルールに宣言ルールベースの変換が追加されます。
BEGIN
DBMS_STREAMS_ADM.RENAME_TABLE(
rule_name => 'strmadmin.jobs12',
from_table_name => 'hr.jobs',
to_table_name => 'hr.assignments',
step_number => 0,
operation => 'ADD');
END;
/
このプロシージャによって追加された宣言ルールベースの変換では、ルールjobs12が行LCRについてTRUEと評価された場合に、行LCR内の表hr.jobsの名前がhr.assignmentsに変更されます。jobs12ルールに複数の宣言ルールベースの変換が指定された場合、step_numberパラメータが0(ゼロ)に設定されているため、この変換はデフォルトの変換順序に従って実行されます。また、operationパラメータがADDに設定されており、変換はルールから削除されるのではなく、ルールに追加されることを示しています。
RENAME_TABLEプロシージャでは、表の他にスキーマ名を変更する変換を追加することもできます。たとえば、前述の例でスキーマ名をoeに変更するように指定するには、to_table_nameパラメータにoe.assignmentsを指定します。
19.1.1.2 列を追加する宣言ルールベースの変換の追加
DBMS_STREAMS_ADMパッケージのADD_COLUMNプロシージャを使用して、行LCR内の行に列を追加する宣言ルールベースの変換を追加します。たとえば、次のプロシージャを実行すると、strmadminスキーマのemployees35ルールに宣言ルールベースの変換が追加されます。
BEGIN
DBMS_STREAMS_ADM.ADD_COLUMN(
rule_name => 'employees35',
table_name => 'hr.employees',
column_name => 'birth_date',
column_value => ANYDATA.ConvertDate(NULL),
value_type => 'NEW',
step_number => 0,
operation => 'ADD');
END;
/
このプロシージャによって追加された宣言ルールベースの変換では、ルールemployees35が行LCRについてTRUEと評価された場合に、行LCR内のhr.employees表の行に、データ型DATEのbirth_date列が追加されます。
ANYDATA.ConvertDateファンクションによって列の型および列の値が指定されることに注意してください。この例では、追加された列の値はNULLです。ただし、有効な日付を指定することもできます。追加する列に適したANYDATAファンクションを使用します。たとえば、追加する列のデータ型がNUMBERである場合、ANYDATA.ConvertNumberファンクションを使用します。
value_typeパラメータがNEWに設定されており、これは、行LCR内の新しい値に列が追加されることを示しています。OLDを指定して、古い値に列を追加することもできます。
employees35ルールに複数の宣言ルールベースの変換が指定された場合、step_numberパラメータが0(ゼロ)に設定されているため、この変換はデフォルトの変換順序に従って実行されます。また、operationパラメータがADDに設定されており、変換はルールから削除されるのではなく、ルールに追加されることを示しています。
注意:
ADD_COLUMNプロシージャはオーバーロードされます。column_functionパラメータを指定すると、追加された列の値を現行のシステム日付またはタイムスタンプにすることができます。column_valueとcolumn_functionパラメータは相互に排他的です。
関連項目:
AnyData型ファンクションの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照
19.1.2 既存の宣言ルールベースの変換の上書き
宣言ルールベースの変換を追加するプロシージャのoperationパラメータをADDに設定すると、次のリストのパラメータが既存の変換パラメータと一致した場合に、既存の宣言ルールベースの変換が上書きされます。
-
ADD_COLUMNプロシージャ:rule_name、table_name、column_nameおよびstep_numberパラメータ -
DELETE_COLUMNプロシージャ:rule_name、table_name、column_nameおよびstep_numberパラメータ -
KEEP_COLUMNSプロシージャ:rule_name、table_name、column_listおよびstep_numberパラメータ、またはrule_name、table_name、column_tableおよびstep_numberパラメータ(column_listおよびcolumn_tableパラメータは相互に排他的です) -
RENAME_COLUMNプロシージャ:rule_name、table_name、from_column_nameおよびstep_numberパラメータ -
RENAME_SCHEMAプロシージャ:rule_name、from_schema_nameおよびstep_numberパラメータ -
RENAME_TABLEプロシージャ:rule_name、from_table_nameおよびstep_numberパラメータ
たとえば、次のプロシージャを実行して、既存の宣言ルールベースの変換を作成したとします。
BEGIN
DBMS_STREAMS_ADM.RENAME_COLUMN(
rule_name => 'departments33',
table_name => 'hr.departments',
from_column_name => 'manager_id',
to_column_name => 'lead_id',
value_type => 'NEW',
step_number => 0,
operation => 'ADD');
END;
/
次のプロシージャを実行すると、この既存の宣言ルールベースの変換は上書きされます。
BEGIN
DBMS_STREAMS_ADM.RENAME_COLUMN(
rule_name => 'departments33',
table_name => 'hr.departments',
from_column_name => 'manager_id',
to_column_name => 'lead_id',
value_type => '*',
step_number => 0,
operation => 'ADD');
END;
/
この場合、宣言ルールベースの変換のvalue_typeパラメータがNEWから*に変更されています。つまり、元の変換では新しい値の名前のみが行LCRで変更されますが、新しい変換では古い値と新しい値の両方の名前が行LCRで変更されます。
19.1.3 宣言ルールベースの変換の削除
宣言ルールベースの変換をルールから削除するには、変換を追加するために使用したものと同じプロシージャを使用しますが、operationパラメータにREMOVEを指定します。たとえば、「表名を変更する宣言ルールベースの変換の追加」で追加した変換を削除するには、次のプロシージャを実行します。
BEGIN
DBMS_STREAMS_ADM.RENAME_TABLE(
rule_name => 'strmadmin.jobs12',
from_table_name => 'hr.jobs',
to_table_name => 'hr.assignments',
step_number => 0,
operation => 'REMOVE');
END;
/
「宣言ルールベースの変換の管理」に示すいずれかの宣言変換プロシージャでoperationパラメータがREMOVEに設定されている場合、そのプロシージャのrule_nameパラメータ以外のパラメータはオプションになります。これらのオプションのパラメータがNULLに設定されている場合、これらはワイルドカードになります。
前述の例のRENAME_TABLEプロシージャは、1つ以上のオプションのパラメータがNULLに設定されている場合、次のように動作します。
| from_table_nameパラメータ | to_table_nameパラメータ | step_numberパラメータ | 結果 |
|---|---|---|---|
|
|
|
|
指定したルールからすべての表名変更変換が削除されます |
|
|
|
|
指定した |
|
|
|
|
指定した |
|
|
|
|
指定した |
|
|
|
|
指定した |
|
|
|
|
指定した |
|
|
|
|
指定した |
オプションのパラメータをNULLに設定してoperationパラメータをREMOVEに設定した場合、他の宣言変換プロシージャも同様に動作します。
19.2 カスタム・ルールベース変換の管理
ルールのカスタム・ルールベースの変換を設定または設定解除するには、DBMS_STREAMS_ADMパッケージのSET_RULE_TRANSFORM_FUNCTIONプロシージャを使用します。このプロシージャは、ルールのアクション・コンテキストを変更して、カスタム・ルールベースの変換を指定します。
この項では、次のタスクの実行手順を説明します。
注意:
LCRのLONG、LONG RAW、LOBまたはXMLType列のデータは、カスタム・ルールベースの変換で変更しないでください。
注意:
-
ルールのアクション・コンテキストには自動ロック・メカニズムがありません。このため、アクション・コンテキストを複数のセッションで同時に更新しないようにしてください。
-
DDL LCRに対してカスタム・ルールベースの変換を実行するときは、他の変更と一致するようにDDL LCRのDDLテキストの変更が必要になる場合があります。たとえば、DDL LCRの表の名前を変換で変更する場合は、DDLテキストの表名も変換によって同じように変更することが必要です。
19.2.1 カスタム・ルールベースの変換の作成
カスタム・ルールベースの変換ファンクションは、常に1つのメッセージに対して動作しますが、1つまたは多数のメッセージを戻すことができます。メッセージを1つ戻すカスタム・ルールベースの変換ファンクションは、1対1の変換ファンクションです。1対1の変換ファンクションには、次のシグネチャが含まれている必要があります。
FUNCTION user_function ( parameter_name IN ANYDATA) RETURN ANYDATA;
user_functionはファンクション名で、parameter_nameはファンクションに渡されるパラメータの名前です。ファンクションに渡されるパラメータはメッセージをANYDATAにカプセル化したもので、ファンクションではANYDATAにカプセル化したメッセージを戻す必要があります。
2つ以上のメッセージを戻すことができるカスタム・ルールベースの変換ファンクションは、1対多の変換ファンクションです。1対多の変換ファンクションには、次のシグネチャが含まれている必要があります。
FUNCTION user_function ( parameter_name IN ANYDATA) RETURN STREAMS$_ANYDATA_ARRAY;
user_functionはファンクション名で、parameter_nameはファンクションに渡されるパラメータの名前です。ファンクションに渡されるパラメータはメッセージをANYDATAにカプセル化したもので、ファンクションはカプセル化したANYDATAメッセージを0個以上含む配列を戻す必要があります。配列に含まれるカプセル化したANYDATAメッセージが0個の場合、元のメッセージは廃棄されます。1対多の変換ファンクションは、Oracle Streamsの取得プロセスおよび同期取得に対してのみサポートされます。
STREAMS$_ANYDATA_ARRAY型はOracleが提供する型で、次の定義を持ちます。
CREATE OR REPLACE TYPE SYS.STREAMS$_ANYDATA_ARRAY AS VARRAY(2147483647) of SYS.ANYDATA /
次の手順では、1対1のファンクションを使用するカスタム・ルールベースの変換を作成する一般的な手順について説明します。
これらのルールのアクション・コンテキスト内の名前/値ペアを表示する問合せを実行すると、DEPARTMENTS6ルールを含め、ルールごとにカスタム・ルールベースの変換用の名前/値ペアが表示されます。
SELECT
RULE_NAME,
AC.NVN_NAME ACTION_CONTEXT_NAME,
AC.NVN_VALUE.ACCESSVARCHAR2() ACTION_CONTEXT_VALUE
FROM DBA_RULES R, TABLE(R.RULE_ACTION_CONTEXT.ACTX_LIST) AC
WHERE RULE_NAME IN ('DEPARTMENTS5','DEPARTMENTS6','DEPARTMENTS7');
この問合せでは、次のような出力が表示されます。
Rule Name Action Context Name Action Context Value ------------- --------------------------- ------------------------------ DEPARTMENTS5 STREAMS$_ROW_SUBSET INSERT DEPARTMENTS5 STREAMS$_TRANSFORM_FUNCTION "HR"."EXECUTIVE_TO_MANAGEMENT" DEPARTMENTS6 STREAMS$_TRANSFORM_FUNCTION "HR"."EXECUTIVE_TO_MANAGEMENT" DEPARTMENTS7 STREAMS$_ROW_SUBSET DELETE DEPARTMENTS7 STREAMS$_TRANSFORM_FUNCTION "HR"."EXECUTIVE_TO_MANAGEMENT"
また、DBA_STREAMS_TRANSFORM_FUNCTIONデータ・ディクショナリ・ビューを使用して、変換ファンクションを表示することもできます。
関連項目:
この例で使用したSET_RULE_TRANSFORM_FUNCTIONおよびルールのタイプの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照
19.2.2 カスタム・ルールベースの変換の変更
カスタム・ルールベースの変換を変更するには、変換ファンクションを編集するか、またはSET_RULE_TRANSFORM_FUNCTIONプロシージャを実行して異なる変換ファンクションを指定します。この例では、SET_RULE_TRANSFORM_FUNCTIONプロシージャを実行して異なる変換ファンクションを指定します。SET_RULE_TRANSFORM_FUNCTIONプロシージャでは、指定したルールのアクション・コンテキストが変更され、異なる変換ファンクションが実行されるようになります。変換ファンクション自体を編集する場合は、このプロシージャを実行する必要はありません。
この例では、変換ファンクションをhr.execute_to_managementからhr.executive_to_leadに変更して、ルールDEPARTMENTS5のカスタム・ルールベースの変換を変更します。hr.execute_to_managementルールベースの変換は、「カスタム・ルールベースの変換の作成」の例のDEPARTMENTS5ルールに追加したものです。
Oracle Streamsでは、場合によっては、UPDATE操作をINSERTおよびDELETE操作に変換する内部変換が、アクション・コンテキスト内の名前/値ペアを使用してサブセット・ルールによって実行されます。このような変換は、行の移行と呼ばれます。SET_RULE_TRANSFORM_FUNCTIONプロシージャでは、行の移行を実行する名前/値ペアが保持されます。
関連項目:
行の移行の詳細は、「行の移行およびサブセット・ルール」を参照
カスタム・ルールベースの変換を変更するには、次の手順を実行します。
注意:
-
SET_RULE_TRANSFORM_FUNCTIONでは、指定した変換ファンクションが存在するかどうかは検証されません。そのファンクションが存在しない場合、Oracle Streamsのプロセスまたはジョブで変換ファンクションの起動が試行されたときにエラーが発生します。 -
カスタム・ルールベースの変換ファンクションが、Oracle Streamsクライアントがそのファンクションへのアクセスを試行したのと同時に変更された場合、エラーが発生することがあります。
19.2.3 カスタム・ルールベース変換の設定解除
カスタム・ルールベースの変換をルールから設定解除するには、SET_RULE_TRANSFORM_FUNCTIONを実行し、変換ファンクションにNULLを指定します。NULLを指定すると、ルールのアクション・コンテキストでカスタム・ルールベースの変換を指定する名前/値ペアが設定解除されます。この例では、ルールDEPARTMENTS5からカスタム・ルールベースの変換を設定解除します。この変換は、「カスタム・ルールベースの変換の作成」の例のDEPARTMENTS5ルールに追加したものです。
Oracle Streamsでは、場合によっては、UPDATE操作をINSERTおよびDELETE操作に変換する内部変換が、アクション・コンテキスト内の名前/値ペアを使用してサブセット・ルールによって実行されます。このような変換は、行の移行と呼ばれます。SET_RULE_TRANSFORM_FUNCTIONプロシージャでは、行の移行を実行する名前/値ペアが保持されます。
関連項目:
行の移行の詳細は、「行の移行およびサブセット・ルール」を参照
次のプロシージャを実行して、ルールDEPARTMENTS5のカスタム・ルールベースの変換を設定解除します。
BEGIN
DBMS_STREAMS_ADM.SET_RULE_TRANSFORM_FUNCTION(
rule_name => 'departments5',
transform_function => NULL);
END;
/
変換ファンクションが設定解除されたかどうかを確認するには、手順1の問合せを実行します。3つのサブセット・ルールの一貫性を保つために、DEPARTMENTS6およびDEPARTMENTS7ルールのアクション・コンテキストも同様に変更する必要があります。
関連項目:
行の移行の詳細は、「行の移行およびサブセット・ルール」を参照