Oracle Streams環境では、ルールを使用してOracle Streamsクライアント(取得プロセス、伝播、適用プロセスおよびメッセージ・クライアント)の動作を制御します。また、ルール・エンジンのクライアントであるカスタム・アプリケーションも作成できます。この章では、ルール・セット、ルールおよびルールに関連する権限の管理手順について説明します。
次の各項では、ルールの管理について説明します。
この章で説明する各タスクは、特に明記されていないかぎり、適切な権限を付与されているOracle Streams管理者が完了する必要があります。
注意: この章では、評価コンテキストの作成例およびDBMS_RULE.EVALUATE プロシージャを使用したイベントの評価例は説明していません。 これらの例については、第33章「ルールベースのアプリケーションの例」を参照してください。 |
ルール・セットの変更は、そのルール・セットを使用するOracle Streams取得プロセス、伝播および適用プロセスを停止せずに行うことができます。Oracle Streamsはコミットされた直後の変更を検出します。新しいバージョンのルール・セットが使用されるメッセージについて厳密に制御する必要がある場合は、次の手順を実行します。
対応する取得プロセス、伝播および適用プロセスを停止します。
ルール・セットを変更します。
手順1で停止したOracle Streamsクライアントを再起動します。
この項では、次のタスクの実行手順を説明します。
次の例では、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_MESSAGE_PROPAGATION_RULE
ADD_MESSAGE_RULE
ADD_TABLE_PROPAGATION_RULES
ADD_TABLE_RULES
ADD_SUBSET_PROPAGATION_RULES
ADD_SUBSET_RULES
ADD_SCHEMA_PROPAGATION_RULES
ADD_SCHEMA_RULES
ADD_GLOBAL_PROPAGATION_RULES
ADD_GLOBAL_RULES
ADD_SUBSET_PROPAGATION_RULES
およびADD_SUBSET_RULES
を除き、前述のプロシージャは、Oracle Streamsクライアントのポジティブ・ルール・セットまたはネガティブ・ルール・セットを作成できます。ADD_SUBSET_PROPAGATION_RULES
およびADD_SUBSET_RULES
は、Oracle Streamsクライアントのポジティブ・ルール・セットのみを作成できます。
ルール・セットにルールを追加すると、そのルール・セットを使用する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
パラメータをその評価コンテキストに設定できます。
ルール・セットからルールを削除すると、そのルール・セットを使用する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
プロシージャの実行後も、ルールはデータベース内に存在し、他のルール・セットに含まれていた場合は、そのルール・セットに残ります。
次の例では、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つ以上の他のルール・セットに含まれているルールは削除されません。
ルールの変更は、そのルールを使用するOracle Streamsの取得プロセス、伝播および適用プロセスを停止せずに行うことができます。Oracle Streamsはコミットされた直後の変更を検出します。新しいバージョンのルールが使用されるメッセージについて厳密に制御する必要がある場合は、次の手順を実行します。
対応する取得プロセス、伝播および適用プロセスを停止します。
ルールを変更します。
手順1で停止したOracle Streamsクライアントを再起動します。
この項では、次のタスクの実行手順を説明します。
次の例では、DBMS_RULE_ADM
パッケージのCREATE_RULE
プロシージャを使用して、アクション・コンテキストを持たないルールおよびアクション・コンテキストを持つルールを作成します。
アクション・コンテキストを持たないルールを作成するには、次の例のように、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_MESSAGE_PROPAGATION_RULE
ADD_MESSAGE_RULE
ADD_TABLE_PROPAGATION_RULES
ADD_TABLE_RULES
ADD_SUBSET_PROPAGATION_RULES
ADD_SUBSET_RULES
ADD_SCHEMA_PROPAGATION_RULES
ADD_SCHEMA_RULES
ADD_GLOBAL_PROPAGATION_RULES
ADD_GLOBAL_RULES
ADD_SUBSET_PROPAGATION_RULES
およびADD_SUBSET_RULES
を除き、前述のプロシージャは、Oracle Streamsクライアントのポジティブ・ルール・セットまたはネガティブ・ルール・セットにルールを追加できます。ADD_SUBSET_PROPAGATION_RULES
およびADD_SUBSET_RULES
は、Oracle Streamsクライアントのポジティブ・ルール・セットのみにルールを追加できます。
アクション・コンテキストを持つルールを作成するには、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
の名前/値ペアを持つアクション・コンテキストが作成されます。
DBMS_RULE_ADM
パッケージのALTER_RULE
プロシージャを使用すると、既存のルールを変更できます。具体的には、このプロシージャを使用すると次のことができます。
ルール条件の変更
ルールの評価コンテキストの変更
ルールの評価コンテキストの削除
ルールのアクション・コンテキストの名前/値ペアの変更
ルールのアクション・コンテキストへの名前/値ペアの追加
ルールのアクション・コンテキストからの名前/値ペアの削除
ルールに関するコメントの変更
ルールに関するコメントの削除
ここでは、これらの変更の例をいくつか示します。
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; /
注意:
|
ルールのアクション・コンテキストの名前/値ペアを変更するには、最初にルールのアクション・コンテキストから名前/値ペアを削除し、次にルールのアクション・コンテキストに異なる名前/値ペアを追加します。
この例では、ルールrule_dep_10
の名前/値ペアを変更します。そのために、最初にこのルールのアクション・コンテキストから名前course_name
を持つ名前/値ペアを削除し、次に名前は同じ(course_name
)で値は異なる名前/値ペアを追加します。この変更される名前/値ペアは「アクション・コンテキストを持つルールの作成」の例でルールに追加したものです。
アクション・コンテキストに、変更する名前/値ペアの他にも名前/値ペアが含まれている場合、アクション・コンテキストを変更するときには、他の名前/値ペアを変更または削除しないように注意してください。
次の手順に従って、アクション・コンテキストの名前/値ペアを変更します。
次の問合せを実行すると、ルールのアクション・コンテキスト内の名前/値ペアを表示できます。
COLUMN ACTION_CONTEXT_NAME HEADING 'Action Context Name' FORMAT A25 COLUMN AC_VALUE_NUMBER HEADING 'Action Context Number Value' FORMAT 9999 SELECT AC.NVN_NAME ACTION_CONTEXT_NAME, AC.NVN_VALUE.ACCESSNUMBER() AC_VALUE_NUMBER FROM DBA_RULES R, TABLE(R.RULE_ACTION_CONTEXT.ACTX_LIST) AC WHERE RULE_NAME = 'RULE_DEP_10';
この問合せでは、次のような出力が表示されます。
Action Context Name Action Context Number Value ------------------------- --------------------------- course_number 1057
名前/値ペアを変更します。他のユーザーが同時にアクション・コンテキストを変更していないことを確認してください。この手順では、最初にRE$NV_LIST
型のREMOVE_PAIR
メンバー・プロシージャを使用して、名前course_number
を含む名前/値ペアをrule_dep_10
ルールのアクション・コンテキストから削除します。次に、この手順では、同じ型のADD_PAIR
メンバー・プロシージャを使用して、新しい名前/値ペアを含む名前/値ペアをこのルールのアクション・コンテキストに追加します。この場合、追加する名前/値ペアの名前はcourse_number
、値は1108
になります。
この例では、ルールのアクション・コンテキストの既存の名前/値ペアを保持するために、変更前にルールのアクション・コンテキストを選択して変数に挿入しています。
DECLARE action_ctx SYS.RE$NV_LIST; ac_name VARCHAR2(30) := 'course_number'; 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); action_ctx.ADD_PAIR(ac_name, ANYDATA.CONVERTNUMBER(1108)); DBMS_RULE_ADM.ALTER_RULE( rule_name => 'strmadmin.rule_dep_10', action_context => action_ctx); END; /
名前/値ペアが正しく変更されたかどうかを確認するには、手順1の問合せを再実行できます。この問合せでは、次のような出力が表示されます。
Action Context Name Action Context Number Value ------------------------- --------------------------- course_number 1108
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
RE$NV_LIST
型のREMOVE_PAIR
メンバー・プロシージャを使用して、ルールのアクション・コンテキストから名前/値ペアを削除できます。他のユーザーが同時にアクション・コンテキストを変更していないことを確認してください。
名前/値ペアを削除すると、ルールのアクション・コンテキストが変更されます。アクション・コンテキストに、削除する名前/値ペアの他にも名前/値ペアが含まれている場合、アクション・コンテキストを変更するときには、他の名前/値ペアを変更または削除しないように注意してください。
この例では、rule_dep_10
ルールに次の名前/値ペアが含まれていることを想定しています。
名前 | 値 |
---|---|
course_number |
1088 |
dist_list |
admin_list |
関連項目: 次の項の例を完了していれば、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
システム作成ルールとは、DBMS_STREAMS_ADM
パッケージのプロシージャを実行して作成するルールです。DBMS_STREAMS_ADM
パッケージを使用して必要なルール条件を持つルールを作成できない場合は、次の一般的な手順に従って、システム作成ルールに基づく条件を持つ新しいルールを作成できます。
システム作成ルールのルール条件をコピーします。DBA_STREAMS_RULES
データ・ディクショナリ・ビューを問い合せると、システム作成ルールのルール条件を表示できます。
条件を変更します。
変更した条件を持つ新しいルールを作成します。
新しいルールをOracle Streamsの取得プロセス、伝播、適用プロセスまたはメッセージ・クライアントのルール・セットに追加します。
元のルールが不要になった場合は、DBMS_STREAMS_ADM
パッケージのREMOVE_RULE
プロシージャを使用して削除します。
次の例では、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
に設定されている場合は、ルールがデータベースから削除され、それを含むルール・セットから自動的に削除されます。
この項では、次のタスクの実行手順を説明します。
関連項目:
|
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
ユーザーはこのシステム権限を他のユーザーまたはロールに付与できます。
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
ユーザーはこのオブジェクト権限を他のユーザーまたはロールに付与できます。
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; /
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; /