18 ルールの管理
Oracle Streams環境では、ルールを使用してOracle Streamsクライアント(取得プロセス、伝播、適用プロセスおよびメッセージ・クライアント)の動作を制御します。また、ルール・エンジンのクライアントであるカスタム・アプリケーションも作成できます。この章では、ルール・セット、ルールおよびルールに関連する権限の管理手順について説明します。
次の各項では、ルールの管理について説明します。
この章で説明する各タスクは、特に明記されていないかぎり、適切な権限を付与されているOracle Streams管理者が完了する必要があります。
注意:
Oracle Streamsクライアントで使用されるルールおよびルール・セットを変更すると、Oracle Streamsクライアントの動作が変化します。
注意:
この章では、評価コンテキストの作成例およびDBMS_RULE.EVALUATEプロシージャを使用したイベントの評価例は説明していません。これらの例については、『Oracle Streams拡張例』を参照してください。
関連項目:
-
Oracle Streams管理者を作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照
18.1 ルール・セットの管理
ルール・セットの変更は、そのルール・セットを使用するOracle Streams取得プロセス、伝播および適用プロセスを停止せずに行うことができます。Oracle Streamsはコミットされた直後の変更を検出します。新しいバージョンのルール・セットが使用されるメッセージについて厳密に制御する必要がある場合は、次の手順を実行します。
- 対応する取得プロセス、伝播および適用プロセスを停止します。
- ルール・セットを変更します。
- 手順1で停止したOracle Streamsクライアントを再起動します。
この項では、次のタスクの実行手順を説明します。
関連項目:
18.1.1 ルール・セットの作成
次の例では、DBMS_RULE_ADMパッケージのCREATE_RULE_SETプロシージャを実行してルール・セットを作成します。
BEGIN
DBMS_RULE_ADM.CREATE_RULE_SET(
rule_set_name => 'strmadmin.hr_capture_rules',
evaluation_context => 'SYS.STREAMS$_EVALUATION_CONTEXT');
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
-
strmadminスキーマにルール・セットhr_capture_rulesが作成されます。同じ名前と所有者を持つルール・セットは作成できません。 -
ルール・セットが、
SYS.STREAMS$_EVALUATION_CONTEXT評価コンテキストに関連付けられます。これは、Oracleが提供するOracle Streams用の評価コンテキストです。
また、DBMS_STREAMS_ADMパッケージの次のプロシージャを使用すると、Oracle Streamsの取得プロセス、伝播、適用プロセスまたはメッセージ・クライアントにルール・セットが存在しない場合に自動的にルール・セットを作成できます。
ADD_SUBSET_PROPAGATION_RULESおよびADD_SUBSET_RULESを除き、前述のプロシージャは、Oracle Streamsクライアントのポジティブ・ルール・セットまたはネガティブ・ルール・セットを作成できます。ADD_SUBSET_PROPAGATION_RULESおよびADD_SUBSET_RULESは、Oracle Streamsクライアントのポジティブ・ルール・セットのみを作成できます。
関連項目:
Streamsクライアントを作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照
18.1.2 ルール・セットへのルールの追加
ルール・セットにルールを追加すると、そのルール・セットを使用するOracle Streamsクライアントの動作が変化します。手順を実行する前に、ルール・セットにルールを追加した場合のOracle Streamsクライアントへの影響を理解する必要があります。
次の例では、DBMS_RULE_ADMパッケージのADD_RULEプロシージャを実行して、hr_capture_rulesルール・セットにhr_dmlルールを追加します。
BEGIN
DBMS_RULE_ADM.ADD_RULE(
rule_name => 'strmadmin.hr_dml',
rule_set_name => 'strmadmin.hr_capture_rules',
evaluation_context => NULL);
END;
/
この例では、ADD_RULEプロシージャの実行時には評価コンテキストは指定されていません。したがって、ルールに独自の評価コンテキストがなければ、hr_capture_rulesルール・セットの評価コンテキストを継承します。ルール・セットに指定した以外の評価コンテキストをルールで使用する場合は、ADD_RULEプロシージャの実行時にevaluation_contextパラメータをその評価コンテキストに設定できます。
18.1.3 ルール・セットからのルールの削除
ルール・セットからルールを削除すると、そのルール・セットを使用するOracle Streamsクライアントの動作が変化します。手順を実行する前に、ルール・セットからルールを削除した場合のOracle Streamsクライアントへの影響を理解する必要があります。
次の例では、DBMS_RULE_ADMパッケージのREMOVE_RULEプロシージャを実行して、hr_capture_rulesルール・セットからhr_dmlルールを削除します。
BEGIN
DBMS_RULE_ADM.REMOVE_RULE(
rule_name => 'strmadmin.hr_dml',
rule_set_name => 'strmadmin.hr_capture_rules');
END;
/
REMOVE_RULEプロシージャの実行後も、ルールはデータベース内に存在し、他のルール・セットに含まれていた場合は、そのルール・セットに残ります。
関連項目:
「ルールの削除」
18.1.4 ルール・セットの削除
次の例では、DBMS_RULE_ADMパッケージのDROP_RULE_SETプロシージャを実行して、データベースからhr_capture_rulesルール・セットを削除します。
BEGIN
DBMS_RULE_ADM.DROP_RULE_SET(
rule_set_name => 'strmadmin.hr_capture_rules',
delete_rules => FALSE);
END;
/
この例では、DROP_RULE_SETプロシージャのdelete_rulesパラメータがFALSEに設定されています。これはデフォルト設定です。したがって、このルール・セットにルールが含まれている場合、そのルールは削除されません。delete_rulesパラメータをTRUEに設定すると、指定したルール・セットに含まれるルールのうち、他のルール・セットには含まれていないルールは、データベースから自動的に削除されます。ルール・セットのルールのうち、1つ以上の他のルール・セットに含まれているルールは削除されません。
18.2 ルールの管理
ルールの変更は、そのルールを使用するOracle Streamsの取得プロセス、伝播および適用プロセスを停止せずに行うことができます。Oracle Streamsはコミットされた直後の変更を検出します。新しいバージョンのルールが使用されるメッセージについて厳密に制御する必要がある場合は、次の手順を実行します。
-
対応する取得プロセス、伝播および適用プロセスを停止します。
-
ルールを変更します。
-
手順1で停止したOracle Streamsクライアントを再起動します。
この項では、次のタスクの実行手順を説明します。
18.2.1 ルールの作成
次の例では、DBMS_RULE_ADMパッケージのCREATE_RULEプロシージャを使用して、アクション・コンテキストを持たないルールおよびアクション・コンテキストを持つルールを作成します。
18.2.1.1 アクション・コンテキストを持たないルールの作成
アクション・コンテキストを持たないルールを作成するには、次の例のように、CREATE_RULEプロシージャを実行し、rule_nameパラメータを使用してルールの名前、conditionパラメータを使用してルール条件を指定します。
BEGIN
DBMS_RULE_ADM.CREATE_RULE(
rule_name => 'strmadmin.hr_dml',
condition => ' :dml.get_object_owner() = ''HR'' ');
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
-
strmadminスキーマにルールhr_dmlが作成されます。同じ名前と所有者を持つルールは作成できません。 -
hrスキーマ内の表に対するDML変更について、TRUEと評価される条件が作成されます。
この例では、ルールの評価コンテキストは指定されていません。したがって、このルールは追加先となるルール・セットの評価コンテキストを継承します。または、DBMS_RULE_ADM.ADD_RULEプロシージャを実行してこのルールをルール・セットに追加するときに、明示的に評価コンテキストが割り当てられます。この時点では、ルールはどのルール・セットにも属していないため、このルールは評価できません。
また、DBMS_STREAMS_ADMパッケージの次のプロシージャを使用すると、自動的にルールを作成してルール・セットに追加できます。
ADD_SUBSET_PROPAGATION_RULESおよびADD_SUBSET_RULESを除き、前述のプロシージャは、Oracle Streamsクライアントのポジティブ・ルール・セットまたはネガティブ・ルール・セットにルールを追加できます。ADD_SUBSET_PROPAGATION_RULESおよびADD_SUBSET_RULESは、Oracle Streamsクライアントのポジティブ・ルール・セットのみにルールを追加できます。
関連項目:
Streamsクライアントを作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照
18.2.1.2 アクション・コンテキストを持つルールの作成
アクション・コンテキストを持つルールを作成するには、CREATE_RULEプロシージャを実行し、rule_nameパラメータを使用してルールの名前、conditionパラメータを使用してルール条件、action_contextパラメータを使用してルールのアクション・コンテキストを指定します。RE$NV_LIST型のADD_PAIRメンバー・プロシージャを使用すると、アクション・コンテキストに名前/値ペアを追加できます。
次の例では、非NULLのアクション・コンテキストを持つルールを作成します。
DECLARE
ac SYS.RE$NV_LIST;
BEGIN
ac := SYS.RE$NV_LIST(NULL);
ac.ADD_PAIR('course_number', ANYDATA.CONVERTNUMBER(1057));
DBMS_RULE_ADM.CREATE_RULE(
rule_name => 'strmadmin.rule_dep_10',
condition => ' :dml.get_object_owner()=''HR'' AND ' ||
' :dml.get_object_name()=''EMPLOYEES'' AND ' ||
' (:dml.get_value(''NEW'', ''DEPARTMENT_ID'').AccessNumber()=10) AND ' ||
' :dml.get_command_type() = ''INSERT'' ',
action_context => ac);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
-
strmadminスキーマにルールrule_dep_10が作成されます。同じ名前と所有者を持つルールは作成できません。 -
department_idが10のhr.employees表への挿入についてTRUEと評価される条件が作成されます。 -
名前が
course_numberで、値が1057の名前/値ペアを持つアクション・コンテキストが作成されます。
関連項目:
アクション・コンテキストにこのような名前/値ペアを使用する例については、「ルール・アクション・コンテキスト」を参照
18.2.2 ルールの変更
DBMS_RULE_ADMパッケージのALTER_RULEプロシージャを使用すると、既存のルールを変更できます。具体的には、このプロシージャを使用すると次のことができます。
-
ルール条件の変更
-
ルールの評価コンテキストの変更
-
ルールの評価コンテキストの削除
-
ルールのアクション・コンテキストの名前/値ペアの変更
-
ルールのアクション・コンテキストへの名前/値ペアの追加
-
ルールのアクション・コンテキストからの名前/値ペアの削除
-
ルールに関するコメントの変更
-
ルールに関するコメントの削除
次の各項では、これらの変更の例をいくつか示します。
18.2.2.1 ルール条件の変更
ALTER_RULEプロシージャのconditionパラメータを使用すると、既存のルールの条件を変更できます。たとえば、「ルールの作成」で作成したルールの条件を変更する必要がある場合を考えます。既存のhr_dmlルールの条件は、hrスキーマ内の任意のオブジェクトに対する任意のDML変更についてTRUEと評価されます。このスキーマ内のemployees表に対する変更を除外する必要がある場合は、hr.employees表に対するDML変更についてはFALSEと評価されるが、このスキーマの他の表に対するDML変更については引き続きTRUEと評価されるように、このルールを変更できます。次のプロシージャを実行すると、ルールが前述のとおり変更されます。
BEGIN
DBMS_RULE_ADM.ALTER_RULE(
rule_name => 'strmadmin.hr_dml',
condition => ' :dml.get_object_owner() = ''HR'' AND NOT ' ||
' :dml.get_object_name() = ''EMPLOYEES'' ',
evaluation_context => NULL);
END;
/注意:
-
ルールの条件を変更すると、そのルールを含むすべてのルール・セットに影響します。
-
ルールのアクション・コンテキストを保持しながらルールを変更するには、
ALTER_RULEプロシージャのaction_contextパラメータにNULLを指定します。NULLは、action_contextパラメータのデフォルト値です。 -
ルールが同期取得のルール・セットに含まれている場合、ルールの条件
:dml.get_object_nameおよび:dml.get_object_ownerは変更しないでください。これらの条件を変更すると、同期取得でデータベース・オブジェクトの変更が取得されなくなる場合があります。同期取得のルールに含まれる他の条件は変更できます。
18.2.2.2 ルールのアクション・コンテキストの名前/値ペアの変更
ルールのアクション・コンテキストの名前/値ペアを変更するには、最初にルールのアクション・コンテキストから名前/値ペアを削除し、次にルールのアクション・コンテキストに異なる名前/値ペアを追加します。
この例では、ルールrule_dep_10の名前/値ペアを変更します。そのために、最初にこのルールのアクション・コンテキストから名前course_nameを持つ名前/値ペアを削除し、次に名前は同じ(course_name)で値は異なる名前/値ペアを追加します。この変更される名前/値ペアは「アクション・コンテキストを持つツールの作成」の例でルールに追加したものです。
アクション・コンテキストに、変更する名前/値ペアの他にも名前/値ペアが含まれている場合、アクション・コンテキストを変更するときには、他の名前/値ペアを変更または削除しないように注意してください。
次の手順に従って、アクション・コンテキストの名前/値ペアを変更します。
18.2.2.3 ルールのアクション・コンテキストへの名前/値ペアの追加
RE$NV_LIST型のADD_PAIRメンバー・プロシージャを使用して新しいペアを追加する前に、アクション・コンテキストを選択して変数に挿入すると、アクション・コンテキスト内の既存の名前/値ペアを保持できます。他のユーザーがアクション・コンテキストを同時に変更していないことを確認してください。次の例では、rule_dep_10ルールのアクション・コンテキスト内の既存の名前/値ペアが保持され、名前がdist_listで値がadmin_listの新しい名前/値ペアが追加されます。
DECLARE
action_ctx SYS.RE$NV_LIST;
ac_name VARCHAR2(30) := 'dist_list';
BEGIN
action_ctx := SYS.RE$NV_LIST(SYS.RE$NV_ARRAY());
SELECT RULE_ACTION_CONTEXT
INTO action_ctx
FROM DBA_RULES R
WHERE RULE_OWNER='STRMADMIN' AND RULE_NAME='RULE_DEP_10';
action_ctx.ADD_PAIR(ac_name,
ANYDATA.CONVERTVARCHAR2('admin_list'));
DBMS_RULE_ADM.ALTER_RULE(
rule_name => 'strmadmin.rule_dep_10',
action_context => action_ctx);
END;
/
名前/値ペアが正しく追加されたかどうかを確認するには、次の問合せを実行できます。
COLUMN ACTION_CONTEXT_NAME HEADING 'Action Context Name' FORMAT A25
COLUMN AC_VALUE_NUMBER HEADING 'Action Context|Number Value' FORMAT 9999
COLUMN AC_VALUE_VARCHAR2 HEADING 'Action Context|Text Value' FORMAT A25
SELECT
AC.NVN_NAME ACTION_CONTEXT_NAME,
AC.NVN_VALUE.ACCESSNUMBER() AC_VALUE_NUMBER,
AC.NVN_VALUE.ACCESSVARCHAR2() AC_VALUE_VARCHAR2
FROM DBA_RULES R, TABLE(R.RULE_ACTION_CONTEXT.ACTX_LIST) AC
WHERE RULE_NAME = 'RULE_DEP_10';
この問合せでは、次のような出力が表示されます。
Action Context Action Context Action Context Name Number Value Text Value ------------------------- -------------- ------------------------- course_number 1088 dist_list admin_list
関連項目:
アクション・コンテキストに同様の名前/値ペアを使用する例については、「ルール・アクション・コンテキスト」を参照
18.2.2.4 ルールのアクション・コンテキストからの名前/値ペアの削除
RE$NV_LIST型のREMOVE_PAIRメンバー・プロシージャを使用して、ルールのアクション・コンテキストから名前/値ペアを削除できます。他のユーザーがアクション・コンテキストを同時に変更していないことを確認してください。
名前/値ペアを削除すると、ルールのアクション・コンテキストが変更されます。アクション・コンテキストに、削除する名前/値ペアの他にも名前/値ペアが含まれている場合、アクション・コンテキストを変更するときには、他の名前/値ペアを変更または削除しないように注意してください。
この例では、rule_dep_10ルールに次の名前/値ペアが含まれていることを想定しています。
| 名前 | 値 |
|---|---|
|
|
|
|
|
|
関連項目:
次の項の例を完了していれば、rule_dep_10ルールにこれらの名前/値ペアが追加されています。
この例では、既存のアクション・コンテキストを選択して変数に挿入し、名前がdist_listの名前/値ペアを削除します。これによって、rule_dep_10ルールのアクション・コンテキスト内の削除しない既存の名前/値ペアが保持されます。
DECLARE
action_ctx SYS.RE$NV_LIST;
ac_name VARCHAR2(30) := 'dist_list';
BEGIN
SELECT RULE_ACTION_CONTEXT
INTO action_ctx
FROM DBA_RULES R
WHERE RULE_OWNER='STRMADMIN' AND RULE_NAME='RULE_DEP_10';
action_ctx.REMOVE_PAIR(ac_name);
DBMS_RULE_ADM.ALTER_RULE(
rule_name => 'strmadmin.rule_dep_10',
action_context => action_ctx);
END;
/
アクション・コンテキスト内の他の名前/値ペアを削除せずに名前/値ペアが正しく削除されたかどうかを確認するには、次の問合せを実行できます。
COLUMN ACTION_CONTEXT_NAME HEADING 'Action Context Name' FORMAT A25
COLUMN AC_VALUE_NUMBER HEADING 'Action Context|Number Value' FORMAT 9999
COLUMN AC_VALUE_VARCHAR2 HEADING 'Action Context|Text Value' FORMAT A25
SELECT
AC.NVN_NAME ACTION_CONTEXT_NAME,
AC.NVN_VALUE.ACCESSNUMBER() AC_VALUE_NUMBER,
AC.NVN_VALUE.ACCESSVARCHAR2() AC_VALUE_VARCHAR2
FROM DBA_RULES R, TABLE(R.RULE_ACTION_CONTEXT.ACTX_LIST) AC
WHERE RULE_NAME = 'RULE_DEP_10';
この問合せでは、次のような出力が表示されます。
Action Context Action Context Action Context Name Number Value Text Value ------------------------- -------------- ------------------------- course_number 1108
18.2.3 システム作成ルールの変更
システム作成ルールとは、DBMS_STREAMS_ADMパッケージのプロシージャを実行して作成するルールです。DBMS_STREAMS_ADMパッケージを使用して必要なルール条件を持つルールを作成できない場合は、次の一般的な手順に従って、システム作成ルールに基づく条件を持つルールを作成できます。
- システム作成ルールのルール条件をコピーします。
DBA_STREAMS_RULESデータ・ディクショナリ・ビューを問い合せると、システム作成ルールのルール条件を表示できます。 - 条件を変更します。
- 変更した条件を持つルールを作成します。
- 新しいルールをOracle Streamsの取得プロセス、伝播、適用プロセスまたはメッセージ・クライアントのルール・セットに追加します。
- 元のルールが不要になった場合は、
DBMS_STREAMS_ADMパッケージのREMOVE_RULEプロシージャを使用して削除します。
関連項目:
-
Oracle Streamsに関連するデータ・ディクショナリ・ビューの詳細は、「Oracle Streams環境の監視」を参照
18.2.4 ルールの削除
次の例では、DBMS_RULE_ADMパッケージのDROP_RULEプロシージャを実行して、データベースからhr_dmlルールを削除します。
BEGIN
DBMS_RULE_ADM.DROP_RULE(
rule_name => 'strmadmin.hr_dml',
force => FALSE);
END;
/
この例では、DROP_RULEプロシージャのforceパラメータがFALSEに設定されています。これはデフォルト設定です。したがって、このルールが1つ以上のルール・セットに含まれている場合は削除できません。forceパラメータがTRUEに設定されている場合は、ルールがデータベースから削除され、それを含むルール・セットから自動的に削除されます。
18.3 評価コンテキスト、ルール・セットおよびルールに対する権限の管理
この項では、次のタスクの実行手順を説明します。
関連項目:
-
『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』の
DBMS_RULE_ADMパッケージのGRANT_SYSTEM_PRIVILEGEおよびGRANT_OBJECT_PRIVILEGEプロシージャに関する項を参照
18.3.1 評価コンテキスト、ルール・セットおよびルールに対するシステム権限の付与
DBMS_RULE_ADMパッケージのGRANT_SYSTEM_PRIVILEGEプロシージャを使用すると、評価コンテキスト、ルール・セットおよびルールに対するシステム権限をユーザーおよびロールに付与できます。これらの権限によって、ユーザーは自分のスキーマ内で、またはANYバージョンの権限が付与されている場合は任意のスキーマ内で、これらのオブジェクトを作成、変更、実行または削除できます。
たとえば、hrユーザーに自分のスキーマ内で評価コンテキストを作成するための権限を付与するには、権限の付与およびユーザーの変更を行うことができるユーザーとして接続し、次のように入力します。
BEGIN
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => SYS.DBMS_RULE_ADM.CREATE_EVALUATION_CONTEXT_OBJ,
grantee => 'hr',
grant_option => FALSE);
END;
/
この例では、GRANT_SYSTEM_PRIVILEGEプロシージャのgrant_optionパラメータがFALSEに設定されています。これはデフォルト設定です。したがって、hrユーザーは、他のユーザーやロールにはCREATE_EVALUATION_CONTEXT_OBJシステム権限を付与できません。grant_optionパラメータをTRUEに設定した場合、hrユーザーはこのシステム権限を他のユーザーまたはロールに付与できます。
18.3.2 評価コンテキスト、ルール・セットまたはルールに対するオブジェクト権限の付与
DBMS_RULE_ADMパッケージのGRANT_OBJECT_PRIVILEGEプロシージャを使用すると、特定の評価コンテキスト、ルール・セットまたはルールに対するオブジェクト権限を付与できます。これらの権限を付与されたユーザーは、指定されたオブジェクトを変更または実行できます。
たとえば、hrユーザーに、strmadminスキーマ内のルール・セットhr_capture_rulesを変更および実行するための権限を付与するには、次のように入力します。
BEGIN
DBMS_RULE_ADM.GRANT_OBJECT_PRIVILEGE(
privilege => SYS.DBMS_RULE_ADM.ALL_ON_RULE_SET,
object_name => 'strmadmin.hr_capture_rules',
grantee => 'hr',
grant_option => FALSE);
END;
/
この例では、GRANT_OBJECT_PRIVILEGEプロシージャのgrant_optionパラメータがFALSEに設定されています(デフォルト)。したがって、hrユーザーは、指定されたルール・セットに対するALL_ON_RULE_SETオブジェクト権限を他のユーザーやロールに付与できません。grant_optionパラメータをTRUEに設定した場合、hrユーザーはこのオブジェクト権限を他のユーザーまたはロールに付与できます。
18.3.3 評価コンテキスト、ルール・セットおよびルールに対するシステム権限の取消し
DBMS_RULE_ADMパッケージのREVOKE_SYSTEM_PRIVILEGEプロシージャを使用すると、評価コンテキスト、ルール・セットおよびルールに対するシステム権限を取り消すことができます。
たとえば、hrユーザーが自分のスキーマ内で評価コンテキストを作成するための権限を取り消すには、権限の付与およびユーザーの変更を行うことができるユーザーとして接続し、次のように入力します。
BEGIN
DBMS_RULE_ADM.REVOKE_SYSTEM_PRIVILEGE(
privilege => SYS.DBMS_RULE_ADM.CREATE_EVALUATION_CONTEXT_OBJ,
revokee => 'hr');
END;
/18.3.4 評価コンテキスト、ルール・セットまたはルールに対するオブジェクト権限の取消し
DBMS_RULE_ADMパッケージのREVOKE_OBJECT_PRIVILEGEプロシージャを使用すると、特定の評価コンテキスト、ルール・セットまたはルールに対するオブジェクト権限を取り消すことができます。
たとえば、hrユーザーから、strmadminスキーマ内のルール・セットhr_capture_rulesを変更および実行するための権限を取り消すには、次のように入力します。
BEGIN
DBMS_RULE_ADM.REVOKE_OBJECT_PRIVILEGE(
privilege => SYS.DBMS_RULE_ADM.ALL_ON_RULE_SET,
object_name => 'strmadmin.hr_capture_rules',
revokee => 'hr');
END;
/