ヘッダーをスキップ
Oracle® Streams概要および管理
11gリリース2 (11.2)
B61351-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

19 ルールベースの変換の管理

Oracle Streamsでのルールベースの変換は、ポジティブ・ルール・セットルールTRUEに評価される場合に行われるメッセージの変更を意味します。ルールベースの変換には、宣言とカスタムという2つのタイプがあります。

次の項では、ルールベースの変換の管理について説明します。


注意:

ルールがポジティブ・ルール・セットに含まれる場合にのみ、ルールに指定した変換が実行されます。ルールが取得プロセス伝播適用プロセスまたはメッセージ・クライアントネガティブ・ルール・セットに含まれる場合、これらのOracle Streamsクライアントではルールベースの変換が無視されます。

宣言ルールベースの変換の管理

宣言ルールベースの変換を管理するには、DBMS_STREAMS_ADMパッケージのADD_COLUMNDELETE_COLUMNKEEP_COLUMNSRENAME_COLUMNRENAME_SCHEMAおよびRENAME_TABLEプロシージャを使用します。

この項では、次のタスクの実行手順を説明します。

宣言ルールベースの変換の追加

次の各項では、宣言ルールベースの変換をDMLルールに追加する例について説明します。


注意:

DMLルールに対してのみ宣言ルールベースの変換を指定できます。DDLルールには指定できません。

表名を変更する宣言ルールベースの変換の追加

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を指定します。

列を追加する宣言ルールベースの変換の追加

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表の行に、データ型DATEbirth_date列が追加されます。

ANYDATA.ConvertDateファンクションによって列の型および列の値が指定されることに注意してください。この例では、追加された列の値はNULLです。ただし、有効な日付を指定することもできます。追加する列に適したANYDATAファンクションを使用します。たとえば、追加する列のデータ型がNUMBERである場合、ANYDATA.ConvertNumberファンクションを使用します。

value_typeパラメータがNEWに設定されており、これは、行LCR内の新しい値に列が追加されることを示しています。OLDを指定して、古い値に列を追加することもできます。

employees35ルールに複数の宣言ルールベースの変換が指定された場合、step_numberパラメータが0(ゼロ)に設定されているため、この変換はデフォルトの変換順序に従って実行されます。また、operationパラメータがADDに設定されており、変換はルールから削除されるのではなく、ルールに追加されることを示しています。


注意:

ADD_COLUMNプロシージャはオーバーロードされます。column_functionパラメータを指定すると、追加された列の値を現行のシステム日付またはタイムスタンプにすることができます。column_valuecolumn_functionパラメータは相互に排他的です。


関連項目:

AnyData型ファンクションの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照

既存の宣言ルールベースの変換の上書き

宣言ルールベースの変換を追加するプロシージャのoperationパラメータをADDに設定すると、次のリストのパラメータが既存の変換パラメータと一致した場合に、既存の宣言ルールベースの変換が上書きされます。

  • ADD_COLUMNプロシージャ: rule_nametable_namecolumn_nameおよびstep_numberパラメータ

  • DELETE_COLUMNプロシージャ: rule_nametable_namecolumn_nameおよびstep_numberパラメータ

  • KEEP_COLUMNSプロシージャ: rule_nametable_namecolumn_listおよびstep_numberパラメータ、またはrule_nametable_namecolumn_tableおよびstep_numberパラメータ(column_listおよびcolumn_tableパラメータは相互に排他的です)

  • RENAME_COLUMNプロシージャ: rule_nametable_namefrom_column_nameおよびstep_numberパラメータ

  • RENAME_SCHEMAプロシージャ: rule_namefrom_schema_nameおよびstep_numberパラメータ

  • RENAME_TABLEプロシージャ: rule_namefrom_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で変更されます。

宣言ルールベースの変換の削除

宣言ルールベースの変換ルールから削除するには、変換を追加するために使用したものと同じプロシージャを使用しますが、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 NULL NULL 指定したルールからすべての表名変更変換が削除されます
NULL以外 NULL NULL 指定したfrom_table_nameを含むすべての表名変更変換が、指定したルールから削除されます
NULL NULL以外 NULL 指定したto_table_nameを含むすべての表名変更変換が、指定したルールから削除されます
NULL NULL NULL以外 指定したstep_numberを含むすべての表名変更変換が、指定したルールから削除されます
NULL以外 NULL以外 NULL 指定したfrom_table_nameおよびto_table_nameを含むすべての表名変更変換が、指定したルールから削除されます
NULL NULL以外 NULL以外 指定したto_table_nameおよびstep_numberを含むすべての表名変更変換が、指定したルールから削除されます
NULL以外 NULL NULL以外 指定したfrom_table_nameおよびstep_numberを含むすべての表名変更変換が、指定したルールから削除されます

オプションのパラメータをNULLに設定してoperationパラメータをREMOVEに設定した場合、他の宣言変換プロシージャも同様に動作します。

カスタム・ルールベース変換の管理

ルールカスタム・ルールベースの変換を設定または設定解除するには、DBMS_STREAMS_ADMパッケージのSET_RULE_TRANSFORM_FUNCTIONプロシージャを使用します。このプロシージャは、ルールのアクション・コンテキストを変更して、カスタム・ルールベースの変換を指定します。

この項では、次のタスクの実行手順を説明します。


注意:

LCRのLONGLONG RAW、LOBまたはXMLType列のデータは、カスタム・ルールベースの変換で変更しないでください。


注意:

  • ルールのアクション・コンテキストには自動ロック・メカニズムがありません。このため、アクション・コンテキストを複数のセッションで同時に更新しないようにしてください。

  • DDL LCRに対してカスタム・ルールベースの変換を実行するときは、他の変更と一致するようにDDL LCRのDDLテキストの変更が必要になる場合があります。たとえば、DDL LCRの表の名前を変換で変更する場合は、DDLテキストの表名も変換によって同じように変更することが必要です。


カスタム・ルールベースの変換の作成

カスタム・ルールベースの変換ファンクションは、常に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のファンクションを使用するカスタム・ルールベースの変換を作成する一般的な手順について説明します。

  1. SQL*Plusで、管理ユーザーまたはPL/SQLファンクションを所有するユーザーとしてデータベースに接続します。この例では、hrユーザーとして接続します。

    SQL*Plusでデータベースに接続する方法については、『Oracle Database管理者ガイド』を参照してください。

  2. 変換を実行するPL/SQLファンクションを作成します。


    注意:

    変換ファンクションが決定的であるようにしてください。決定的なファンクションでは、入力された引数の値がどのような組合せであっても、常に同じ値が戻されます。また、変換ファンクションで例外が発生しないようにしてください。例外により、取得プロセス、伝播または適用プロセスが無効化される場合があり、これらの処理を続行するために変換ファンクションの修正が必要になります。同期取得のカスタム・ルールベースの変換で例外が発生すると、その例外を発生させたDML文が強制終了されます。メッセージ・クライアントのカスタム・ルールベースの変換で例外が発生すると、メッセージ・クライアントでメッセージをデキューできなくなる場合があります。

    次の例では、departments表のdepartment_name列の値をExecutiveからManagementに変更するファンクションexecutive_to_managementhrスキーマ内に作成されます。会社の事業所の1つがこの部門に異なる名称を使用している場合に、このような変換が必要になることがあります。

    CREATE OR REPLACE FUNCTION hr.executive_to_management(in_any IN ANYDATA) 
    RETURN ANYDATA
    IS
      lcr SYS.LCR$_ROW_RECORD;
      rc  NUMBER;
      ob_owner VARCHAR2(30);
      ob_name VARCHAR2(30);
      dep_value_anydata ANYDATA;
      dep_value_varchar2 VARCHAR2(30);
    BEGIN
      -- Get the type of object
      -- Check if the object type is SYS.LCR$_ROW_RECORD
      IF in_any.GETTYPENAME='SYS.LCR$_ROW_RECORD' THEN
        -- Put the row LCR into lcr
        rc := in_any.GETOBJECT(lcr);
        -- Get the object owner and name
        ob_owner := lcr.GET_OBJECT_OWNER();
        ob_name := lcr.GET_OBJECT_NAME();
        -- Check for the hr.departments table
        IF ob_owner = 'HR' AND ob_name = 'DEPARTMENTS' THEN
          -- Get the old value of the department_name column in the LCR
          dep_value_anydata := lcr.GET_VALUE('old','DEPARTMENT_NAME');
          IF dep_value_anydata IS NOT NULL THEN
            -- Put the column value into dep_value_varchar2
            rc := dep_value_anydata.GETVARCHAR2(dep_value_varchar2);
            -- Change a value of Executive in the column to Management
            IF (dep_value_varchar2 = 'Executive') THEN
              lcr.SET_VALUE('OLD','DEPARTMENT_NAME',
                ANYDATA.CONVERTVARCHAR2('Management'));
            END IF;
          END IF;
          -- Get the new value of the department_name column in the LCR
          dep_value_anydata := lcr.GET_VALUE('new', 'DEPARTMENT_NAME', 'n');
          IF dep_value_anydata IS NOT NULL THEN
            -- Put the column value into dep_value_varchar2
            rc := dep_value_anydata.GETVARCHAR2(dep_value_varchar2);
            -- Change a value of Executive in the column to Management
            IF (dep_value_varchar2 = 'Executive') THEN
              lcr.SET_VALUE('new','DEPARTMENT_NAME',
                ANYDATA.CONVERTVARCHAR2('Management'));
            END IF;
          END IF;
        END IF;
        RETURN ANYDATA.CONVERTOBJECT(lcr);
      END IF;
    RETURN in_any;
    END;
    /
    
  3. Oracle Streams管理者にhr.executive_to_managementファンクションのEXECUTE権限を付与します。

    GRANT EXECUTE ON hr.executive_to_management TO strmadmin;
    
  4. データベースにOracle Streams管理者として接続します。

  5. hr.departments表のDML操作についてサブセット・ルールを作成します。このサブセット・ルールでは、手順2で作成した変換を使用します。

    カスタム・ルールベースの変換を使用する場合、サブセット・ルールは不要です。この例では、複数の名前/値ペアを持つアクション・コンテキストの具体例を示すために、サブセット・ルールを使用しています。この例では、データベースdbs1.example.comの適用プロセスにサブセット・ルールを作成します。これらのルールがTRUEと評価されるのは、hr.departments表内のlocation_id1700の1行に対するDML変更がLCRに含まれる場合です。この例では、streams_queueというANYDATAキューがデータベースに存在することを想定しています。

    これらのルールを作成するには、次のADD_SUBSET_RULESプロシージャを実行します。

    BEGIN 
      DBMS_STREAMS_ADM.ADD_SUBSET_RULES(
        table_name               =>  'hr.departments',
        dml_condition            =>  'location_id=1700',
        streams_type             =>  'apply',
        streams_name             =>  'strm01_apply',
        queue_name               =>  'streams_queue',
        include_tagged_lcr       =>  FALSE,
        source_database          =>  'dbs1.example.com');
    END;
    /
    

    注意:

    • Oracle Streams管理者がルールとルール・セットを作成するには、CREATE_RULE_SET_OBJ(またはCREATE_ANYRULE_SET_OBJ)およびCREATE_RULE_OBJ(またはCREATE_ANY_RULE_OBJ)システム権限が必要です。これらの権限を付与するには、DBMS_RULE_ADMパッケージのGRANT_SYSTEM_PRIVILEGEプロシージャを使用します。

    • この例では、DBMS_STREAMS_ADMパッケージを使用してルールを作成します。また、DBMS_RULE_ADMパッケージを使用してルールを作成し、ルール・セットに追加し、カスタム・ルールベースの変換を指定することもできます。このプロシージャの例については、『Oracle Streams拡張例』を参照してください。

    • ADD_SUBSET_RULESプロシージャでは、適用プロセスのポジティブ・ルール・セットにサブセット・ルールが追加されます。


  6. 次の問合せを実行して、システムで作成されたルールの名前を特定します。

    SELECT RULE_NAME, SUBSETTING_OPERATION FROM DBA_STREAMS_RULES 
      WHERE OBJECT_NAME='DEPARTMENTS' AND DML_CONDITION='location_id=1700';
    

    この問合せでは、次のような出力が表示されます。

    RULE_NAME                      SUBSET
    ------------------------------ ------
    DEPARTMENTS5                   INSERT
    DEPARTMENTS6                   UPDATE
    DEPARTMENTS7                   DELETE
    

    注意:

    この情報を取得するには、ADD_SUBSET_RULESを実行するときにOUTパラメータを使用する方法もあります。

    これらはサブセット・ルールであるため、そのうちの2つには内部変換を実行するNULL以外のアクション・コンテキストが含まれています。

    • サブセット化条件INSERTを持つルールには、更新によってlocation_id列の値が他の値から1700に変更される場合に、更新を挿入に変換する内部変換が含まれています。内部変換は、挿入には影響しません。

    • サブセット化条件DELETEを持つルールには、更新によってlocation_id列の値が1700から他の値に変更される場合に、更新を削除に変換する内部変換が含まれています。内部変換は、削除には影響しません。

    この例では、次の問合せを実行すると、ルールDEPARTMENTS5およびDEPARTMENTS7NULL以外のアクション・コンテキストを持ち、ルールDEPARTMENTS6NULLのアクション・コンテキストを持つことを確認できます。

    COLUMN RULE_NAME HEADING 'Rule Name' FORMAT A13
    COLUMN ACTION_CONTEXT_NAME HEADING 'Action Context Name' FORMAT A27
    COLUMN ACTION_CONTEXT_VALUE HEADING 'Action Context Value' FORMAT A30
    
    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
    DEPARTMENTS7  STREAMS$_ROW_SUBSET         DELETE
    

    DEPARTMENTS6ルールは、アクション・コンテキストがNULLであるため出力には表示されません。

  7. SET_RULE_TRANSFORM_FUNCTIONプロシージャを実行して、カスタム・ルールベースの変換をサブセット・ルールごとに設定します。この手順では、このプロシージャをルールごとに実行し、hr.executive_to_managementを変換ファンクションとして指定します。他のユーザーがアクション・コンテキストを同時に変更していないことを確認してください。

    BEGIN
      DBMS_STREAMS_ADM.SET_RULE_TRANSFORM_FUNCTION(
        rule_name           => 'departments5',
        transform_function  => 'hr.executive_to_management');
      DBMS_STREAMS_ADM.SET_RULE_TRANSFORM_FUNCTION(
        rule_name           => 'departments6',
        transform_function  => 'hr.executive_to_management');
      DBMS_STREAMS_ADM.SET_RULE_TRANSFORM_FUNCTION(
        rule_name           => 'departments7',
        transform_function  => 'hr.executive_to_management');    
    END;
    /
    

    具体的には、このプロシージャでは、STREAMS$_TRANSFORM_FUNCTIONを名前として指定し、変換を実行するPL/SQLファンクションの名前を含むANYDATAインスタンスを値として指定する各ルールのアクション・コンテキストに、名前/値ペアが追加されます。この場合、変換ファンクションはhr.executive_to_managementです。


    注意:

    SET_RULE_TRANSFORM_FUNCTIONでは、指定した変換ファンクションが存在するかどうかは検証されません。そのファンクションが存在しない場合、Oracle Streamsのプロセスまたはジョブで変換ファンクションの起動が試行されたときにエラーが発生します。

これらのルールのアクション・コンテキスト内の名前/値ペアを表示する問合せを実行すると、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パッケージおよびタイプ・リファレンス』を参照

カスタム・ルールベースの変換の変更

カスタム・ルールベースの変換を変更するには、変換ファンクションを編集するか、または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プロシージャでは、行の移行を実行する名前/値ペアが保持されます。


関連項目:

行の移行の詳細は、「行の移行およびサブセット・ルール」を参照

カスタム・ルールベースの変換を変更するには、次の手順を実行します。

  1. 次の問合せを実行すると、ルールのアクション・コンテキスト内のすべての名前/値ペアを表示できます。

    COLUMN ACTION_CONTEXT_NAME HEADING 'Action Context Name' FORMAT A30
    COLUMN ACTION_CONTEXT_VALUE HEADING 'Action Context Value' FORMAT A30
    
    SELECT 
        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 = 'DEPARTMENTS5';
    

    この問合せでは、次のような出力が表示されます。

    Action Context Name            Action Context Value
    ------------------------------ ------------------------------
    STREAMS$_ROW_SUBSET            INSERT
    STREAMS$_TRANSFORM_FUNCTION    "HR"."EXECUTIVE_TO_MANAGEMENT"
    
  2. SET_RULE_TRANSFORM_FUNCTIONプロシージャを実行して、DEPARTMENTS5ルールの変換ファンクションをexecutive_to_leadに設定します。この例では、新しい変換ファンクションがhr.executive_to_leadで、strmadminユーザーにはそのEXECUTE権限が付与されていると想定しています。

    BEGIN
      DBMS_STREAMS_ADM.SET_RULE_TRANSFORM_FUNCTION(
        rule_name           => 'departments5',
        transform_function  => 'hr.executive_to_lead');
    END;
    /  
    

    変換ファンクションが正しく変更されたかどうかを確認するには、手順1の問合せを再実行します。3つのサブセット・ルールの一貫性を保つために、DEPARTMENTS6およびDEPARTMENTS7ルールのアクション・コンテキストも同様に変更する必要があります。


注意:

  • SET_RULE_TRANSFORM_FUNCTIONでは、指定した変換ファンクションが存在するかどうかは検証されません。そのファンクションが存在しない場合、Oracle Streamsのプロセスまたはジョブで変換ファンクションの起動が試行されたときにエラーが発生します。

  • カスタム・ルールベースの変換ファンクションが、Oracle Streamsクライアントがそのファンクションへのアクセスを試行したのと同時に変更された場合、エラーが発生することがあります。


カスタム・ルールベースの変換の設定解除

カスタム・ルールベースの変換ルールから設定解除するには、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ルールのアクション・コンテキストも同様に変更する必要があります。


関連項目:

行の移行の詳細は、「行の移行およびサブセット・ルール」を参照