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
ルールのアクション・コンテキストも同様に変更する必要があります。
関連項目:
行の移行の詳細は、「行の移行およびサブセット・ルール」を参照