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; /