注意: この機能は、Oracle Databaseリリース11.2では非推奨で、リリース12.1では廃止されています。廃止の詳細は、My Oracle Support NoteID 1244535.1を参照してください。 |
DBMS_RLMGR
パッケージには、ルール・マネージャを使用してルールおよびルール・セッションを作成および管理する様々なプロシージャが含まれています。
関連項目: 詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』を参照してください。 |
この章では、次の項目について説明します。
この項では、ルール・マネージャのDBMS_RLMGR
パッケージの使用に関連する項目について説明します。
Oracle Databaseインストールによって、catrul.sql
スクリプトが実行され、DBMS_RLMGR
パッケージがロードされて、必要なルール・マネージャのスキーマ・オブジェクトがEXFSYS
スキーマに作成されます。
DBMS_RLMGR
は、EXFSYS
所有のパッケージであり、AUTHID CURRENT_USER
でコンパイルされます。無名PL/SQLブロックからコールされたすべてのDBMS_RLMGR
サブプログラムは、現行のユーザーの権限を使用して実行されます。
ユーザーには、このパッケージを使用するために、CONNECT
ロールとRESOURCE
ロール、DBMS_LOCK
に対するEXECUTE
権限、およびCREATE VIEW
権限が付与されている必要があります。
ルール・クラスを正常に作成するには、ビュー、オブジェクト・タイプ、表、パッケージおよびプロシージャを作成するための十分な権限が必要です。
ルール・クラスの所有者は、ルール・クラスの削除、ルール・クラス内のルールの処理、ルール・クラスに対するルールの追加と削除を実行する権限を常に所有しています。ルール・クラスの所有者のみがルール・クラスを削除でき、この権限は、他のユーザーには付与できません。ルール・クラスの所有者が持つルール・クラスに対する権限は取り消すことができません。
ルール・クラスの所有者ではないユーザーには、特定のタスクを実行するために、適切なタイプの権限が付与されている必要があります。付与できる権限のタイプは、次のとおりです。
PROCESS RULES
: ルール・クラスに対するPROCESS RULES
権限を持つユーザーは、PROCESS_RULES
プロシージャまたはADD_EVENT
プロシージャを使用して、そのルール・クラスのルールを処理できます。また、この権限を持つユーザーは、対応するルール・クラスの結果ビューを検索できます。
ADD RULE
: ルール・クラスに対するADD RULE
権限を持つユーザーは、そのルール・クラスにルールを追加できます。また、ルール・クラスの所有者は、1つのルール・クラス表に対するINSERT
権限を他のユーザーに付与することもできます。
DELETE RULE
: ルール・クラスに対するDELETE RULE
権限を持つユーザーは、そのルール・クラスからルールを削除できます。また、ルール・クラスの所有者は、1つのルール・クラス表に対するDELETE
権限を他のユーザーに付与することもできます。
ALL
: ルール・クラスに対するALL
権限を付与すると、そのルール・クラスに対する前述のすべての権限がユーザーに付与されます。
ユーザーがルール・クラスの結果ビューを使用するには、対応するルール・クラスに関連付けられているプリミティブ・イベント・タイプに対するEXECUTE
権限が必要です。
ルール・クラスの所有者は、(ルール・クラスと同じ名前の)ルール・クラス表に対してSQL INSERT
文を使用してルールを追加できます。また、ルール・クラスの所有者は、ルール・クラス表に対する直接DML権限を他のユーザーに付与することもできます。スキーマ拡張した名前をルール・クラスに使用する場合は、ルール・クラスにルールを追加するために、ルール・クラスに対するADD RULE
権限が必要です。
ルール・クラスの所有者は、1つのルール・クラス表に対するSQL DELETE
文を使用してルールを削除できます。スキーマ拡張した名前をルール・クラスに使用する場合は、ルール・クラスに対するDELETE RULE
権限が必要です。
スキーマ拡張した名前をルール・クラスに使用する場合は、ルール・クラスに対するPROCESS RULES
権限が必要です。
DBMS_RLMGR.SYNC_TEXT_INDEXES
プロシージャを使用してテキスト索引を正常に同期化するには、CTX_DDL
パッケージに対するEXECUTE
権限が必要です。
ルール・クラスに対する現行のユーザーの権限は、USER_RLMGR_PRIVILEGES
ビューにリストされます。
表124-1に、DBMS_RLMGR
パッケージのサブプログラムを示します。
特に明記されていないかぎり、DBMS_RLMGR
パッケージに定義されているプロシージャに渡されるすべての値と名前で、大/小文字は区別されません。大/小文字の区別が必要な場合は、値を二重引用符で囲んでください。
表124-1 DBMS_RLMGRパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
ADD_ELEMENTARY_ATTRIBUTEプロシージャ |
指定の属性をイベント構造および式フィルタの属性セットに追加します。 |
|
アクティブなセッションのルール・クラスにイベントを追加します。 |
|
イベント構造および式フィルタの属性セットを含むファンクションの承認リストに、ファンクション、タイプまたはパッケージを追加します。 |
|
ルール・クラスにルールを追加します。 |
|
コンポジット・イベントのルール条件からプリミティブ・ルール条件参照を取り出します。 |
|
イベント識別子を使用してイベントをコンシュームし、対応するルールをアクションの実行用に準備します。 |
|
1つ以上のプリミティブ・イベントを悉無律セマンティクスに基づいてコンシュームします。 |
|
同一または異なるルール・クラスからの複数のルールで共有可能なプリミティブ・ルール条件のリポジトリを作成します。 |
|
イベント構造を作成します。 |
|
デフォルトの索引が削除されている場合に、ルール・クラスの式フィルタ索引を作成します。 |
|
ルール・クラスを直接操作するためのルール・クラス・インタフェースのパッケージを作成します。 |
|
ルール・クラスを作成します。 |
|
ルール・クラスのルールを削除します。 |
|
条件表を削除します。 |
|
イベント構造を削除します。 |
|
ルール条件の式フィルタ索引を削除します。 |
|
ルール・クラス・インタフェースのパッケージを削除します。 |
|
ルール・クラスを削除します。 |
|
プリミティブ・イベント構造に属性を追加します。 |
|
コレクション・イベントに対して計算された集計値を取り出します。 |
|
ルール・クラスに対する権限を他のユーザーに付与します。 |
|
指定したイベントのルールを処理します。 |
|
ルール・クラスに関連付けられているすべてのイベントを削除し、いくつかのイベントに一致するルールに関する状態情報をパージすることによって、ルール・クラスをリセットします。 |
|
データベース・セッション内で、新しいルール・セッションを開始します。 |
|
ルール・クラスに対するユーザー権限を取り消します。 |
|
ルール条件の |
このプロシージャは、指定の属性をイベント構造(式フィルタの属性セット)に追加します。このプロシージャはオーバーロードされています。複数の機能を構文形式ごとに、定義とともに示します。
構文
指定の要素属性を属性セットに追加する場合:
DBMS_RLMGR.ADD_ELEMENTARY_ATTRIBUTE ( event_struct IN VARCHAR2, attr_name IN VARCHAR2, attr_type IN VARCHAR2, attr_defvl IN VARCHAR2 default NULL);
表の別名である要素属性を識別して、イベント構造に追加する場合:
DBMS_RLMGR.ADD_ELEMENTARY_ATTRIBUTE ( event_struct IN VARCHAR2, attr_name IN VARCHAR2, tab_alias IN rlm$table_alias);
属性セットへのテキスト属性の追加を許可する場合:
DBMS_RLMGR.ADD_ELEMENTARY_ATTRIBUTE ( event_struct IN VARCHAR2, attr_name IN VARCHAR2, attr_type IN VARCHAR2, text_pref IN EXF$TEXT);
パラメータ
表124-2 ADD_ELEMENTARY_ATTRIBUTEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
この属性を追加するイベント構造(属性セット)の名前。 |
|
追加する要素属性の名前。同じセット内の2つの属性に同じ名前を指定することはできません。 |
|
属性のデータ・タイプ。この引数には、標準のSQLデータ・タイプ、または現行のユーザーがアクセス可能なオブジェクト・タイプの名前を指定できます。 |
|
属性の別名を設定するデータベース表を識別するタイプ。 |
|
要素属性のデフォルト値。 |
|
LEXER、WORDLIST指定などのテキスト・プリファレンス。 |
使用上の注意
このプロシージャは、要素属性をイベント構造に追加します。イベント構造は、式フィルタの属性セットとして内部的に管理されます。最初に既存のオブジェクト・タイプから作成されたイベント構造には、他の属性は追加できません。
式が格納されている列にすでに割り当てられている属性セットには、要素属性は追加できません(この属性セットは、ルール・クラスで使用されるイベント構造と同じです)。
属性セット内の1つ以上またはすべての要素属性は、表の別名として使用できます。要素属性が表の別名である場合、その要素属性に割り当てられる値は、対応する表のROWID
です。表の別名属性が1つ以上ある属性セットは、既存のオブジェクト・タイプからは作成できません。表の別名の詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』を参照してください。
式が格納されている列にすでに割り当てられている属性セットには、要素属性は追加できません。
要素属性の追加の詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』の属性セットの定義に関する項を参照してください。
関連ビュー: USER_EXPFIL_ATTRIBUTE_SETS
およびUSER_EXPFIL_ATTRIBUTES
。
このプロシージャをtext_pref
引数にバインドされたテキスト・プリファレンスとともに使用すると、属性セット内にテキスト属性が作成されます。このような属性のデータ・タイプは、VARCHAR2
またはCLOB
である必要があります。テキスト属性に対して指定されているプリファレンスは、属性のCONTAINS
演算子に関連する述語を処理する場合に使用されます。有効なプリファレンスは、CTXRULE
索引の作成に使用するPARAMETERS
句で有効なプリファレンスです。構文については、『Oracle Textアプリケーション開発者ガイド』を参照してください。
例
次のコマンドでは、2つの要素属性が属性セットに追加されます。
BEGIN DBMS_RLMGR.ADD_ELEMENTARY_ATTRIBUTE ( EVENT_STRUCT => 'HRAttrSet', ATTR_NAME => 'HRREP', attr_type => 'VARCHAR2'); DBMS_RLMGR.ADD_ELEMENTARY_ATTRIBUTE ( EVENT_STRUCT => 'HRAttrSet', ATTR_NAME => 'DEPT', TAB_ALIAS => RLM$TABLE_ALIAS('DEPT')); END;
次のコマンドでは、ホテルの予約(追加情報を含む)に関する属性セットが作成され、CLOB
データ・タイプのAddlInfo
属性として示されます。このイベント構造に指定されているルール条件には、この属性に関するテキストの述語を含めることができます。
BEGIN DBMS_RLMGR.CREATE_EVENT_STRUCT (EVENT_STRUCT => 'AddFlight'); DBMS_RLMGR.ADD_ELEMENTARY_ATTRIBUTE ( EVENT_STRUCT => 'AddHotel', ATTR_NAME => 'CustId', ATTR_TYPE => 'NUMBER'); DBMS_RLMGR.ADD_ELEMENTARY_ATTRIBUTE ( EVENT_STRUCT => 'AddHotel', ATTR_NAME => 'Type', ATTR_TYPE => 'VARCHAR2(20)'); . . . DBMS_RLMGR.ADD_ELEMENTARY_ATTRIBUTE ( EVENT_STRUCT => 'AddHotel', ATTR_NAME => 'AddlInfo', ATTR_TYPE => 'CLOB', TEXT_PREF => EXF$TEXT('LEXER hotelreserv_lexer')); END;
このプロシージャは、アクティブなルール・セッションのルール・クラスにプリミティブ・イベントを追加します。このプロシージャはオーバーロードされています。複数の機能を構文形式ごとに、定義とともに示します。
構文
プリミティブ・イベント・インスタンスの文字列表現をルール・クラスに追加します。
DBMS_RLMGR.ADD_EVENT ( rule_class IN VARCHAR2, event_inst IN VARCHAR2, event_type IN VARCHAR2 default null);
プリミティブ・イベント・インスタンスのAnyData表現をルール・クラスに追加します。
DBMS_RLMGR.ADD_EVENT ( rule_class IN VARCHAR2, event_inst IN sys.AnyData);
使用上の注意
このプロシージャは、アクティブなルール・セッション内のルール・クラスにプリミティブ・イベントまたは単純イベントを追加するために使用します。デフォルトでは、ルール・セッションはデータベース・セッションと同じです。オプションで、RESET_SESSION
またはPROCESS_RULES
プロシージャを使用して、複数の(連続する)ルール・セッションをデータベース・セッション内で開始できます。
ルール・クラスが(1つのみのプリミティブ・イベント構造で構成されている)単純イベント用に構成されている場合は、ADD_EVENT
プロシージャのevent_type
引数を無視できます。また、イベント・インスタンスをAnyData形式で渡す場合は、イベント・タイプ情報がAnyDataインスタンスに埋め込まれます。それ以外の場合は、ルール・クラスに追加するプリミティブ・イベント構造の名前をevent_type
引数に割り当てる必要があります。
イベント・インスタンスが有効な場合、ADD_EVENT
プロシージャは、ルール・クラスのルールを処理し、それらの結果を(ルール・クラスの作成時に構成される)ルール・クラスの結果ビューに取得します。これらの結果は、ルール・セッションが終了するまで保持されます。スキーマ拡張した名前をルール・クラスに使用する場合は、ルール・クラスに対するPROCESS
RULES
権限が必要です。追加情報については、「GRANT_PRIVILEGEプロシージャ」を参照してください。event_type
引数に指定する値は、ルール・クラスの所有者のスキーマ内で常に解決され、スキーマ拡張した名前は使用できません。コンポジット・イベント構造が表の別名のプリミティブ・イベント・タイプで構成されている場合は、対応する表の名前をevent_type
引数に割り当てる必要があります。
例
次のコマンドでは、2種類のプリミティブ・イベント(AddFlight
およびAddRentalCar
)用に構成されているCompTravelPromo
ルール・クラスに2つのイベントが追加されます。
BEGIN DBMS_RLMGR.ADD_EVENT(rule_class => 'CompTravelPromo', event_inst => AddFlight.getVarchar(987, 'Abcair', 'Boston', 'Orlando', '01-APR-2003', '08-APR-2003'), event_type => 'AddFlight'); DBMS_RLMGR.ADD_EVENT(rule_class => 'Scott.CompTravelPromo', event_inst => AnyData.convertObject( AddRentalCar(987, 'Luxury', '03-APR-2003', '08-APR-2003', NULL))); END;/
このプロシージャは、ファンクションの集合を表すユーザー定義ファンクション、パッケージ、またはタイプをイベント構造(式ファイルの属性セット)に追加します。
使用上の注意
デフォルトでは、属性セットによって、ルール条件で使用されるOracle Database提供のすべてのSQLファンクションを暗黙的に参照できます。式セットでユーザー定義ファンクションを参照する場合は、その式セットが属性セットに明示的に追加されている必要があります。
ADD_FUNCTIONS
プロシージャは、ファンクションの集合を表すユーザー定義ファンクション、パッケージまたはタイプを属性セットに追加します。新しい式または変更された式は、このリストを使用して有効性が検証されます。
スキーマ拡張を使用して、ファンクションまたはパッケージの名前を指定できます。スキーマ拡張を使用せずにファンクション名を指定した場合、ルール条件におけるこのような参照のみが有効であるとみなされます。対応するシノニムを属性セットに追加することによって、条件式を制限して、ファンクションまたはパッケージにシノニムを使用できます。これによって、他のスキーマに対する式セットの移植性が保持されます。
属性セットにファンクションを追加する方法の詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』の属性セットの定義に関する項を参照してください。
関連ビュー: USER_EXPFIL_ATTRIBUTE_SETS
およびUSER_EXPFIL_ASET_FUNCTIONS
。
このプロシージャは、ルール・クラスに新しいルールを追加します。
構文
DBMS_RLMGR.ADD_RULE ( rule_class IN VARCHAR2, rule_id IN VARCHAR2, rule_cond IN VARCHAR2, actprf_nml IN VARCHAR2 DEFAULT NULL, actprf_vall IN VARCHAR2 DEFAULT NULL);
パラメータ
表124-5 ADD_RULEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
ルール・クラスの名前。スキーマ拡張したルール・クラス名を使用すると、現行のスキーマに属していないルール・クラスを参照できます。 |
|
ルール・クラス内のルールの一意の識別子。 |
|
ルールの条件。条件では、ルール・クラスのイベント構造で定義された変数が使用されます。 |
|
|
|
|
使用上の注意
このプロシージャは、ルール・クラスに新しいルールを追加するために使用します。ADD_RULE
プロシージャに渡されるルール条件は、ルール・クラスに関連付けられたイベント構造を使用して検証されます。アクション・プリファレンス名のリストは、ルール・クラスの作成時に構成されたアクション・プリファレンス・カテゴリのサブセットです。
スキーマ拡張した名前をルール・クラスに使用する場合は、ルール・クラスに対するADD
RULE
権限が必要です。詳細は、「GRANT_PRIVILEGEプロシージャ」を参照してください。
ルール・クラスの所有者が、(ルール・クラスと同じ名前の)ルール・クラス表に対してSQL INSERT
文を使用してルールを追加することもできます。また、ルール・クラスの所有者は、ルール・クラス表に対する直接DML権限を他のユーザーに付与することもできます。
注意: ADD_RULE プロシージャではなくSQL INSERT 文を使用して新しいルールを追加する場合、ルール・クラスのAUTOCOMMIT プロパティは無視されます。 |
ルール・クラス表の構造については、「CREATE_RULE_CLASSプロシージャ」を参照してください。
例
次のコマンドでは、ルール・クラスにルールが追加されます。
BEGIN DBMS_RLMGR.ADD_RULE ( rule_class => 'CompTravelPromo', rule_id => 'AB_AV_FL', rule_cond => '<condition> <and join="Flt.CustId = Car.CustId"> <object name="Flt"> Airline=''Abcair'' and ToCity=''Orlando'' </object> <object name="Car"> CarType = ''Luxury'' </object> </and> </condition>' , actprf_nml => 'PromoType, OfferedBy', actprf_vall => '''RentalCar'', ''Acar'''); END;
適切な権限がある場合は、次のSQL INSERT
文を使用してルールをルール・クラスに追加できます。
INSERT INTO CompTravelPromo (rlm$ruleid, rlm$rulecond, PromoType, OfferedBy) VALUES ('AB_AV_FL', '<condition> <and join="Flt.CustId = Car.CustId"> <object name="Flt"> Airline=''Abcair'' and ToCity=''Orlando'' </object> <object name="Car"> CarType = ''Luxury'' </object> </and> </condition>', 'RentalCar','Acar');
このファンクションは、コンポジット・イベントのルール条件からプリミティブ・ルール条件参照を取り出します。
使用上の注意
ルート要素<condition>
を持つXML形式のルール条件では、このファンクションは、特定のプリミティブ・イベントにおける共有条件式への参照を取り出します。
ルール・クラス表を操作する問合せでこのファンクションを使用すると、特定のプリミティブ・ルール条件への参照をすべて検索することができます。このような問合せを高速化するために、このファンクションのシグネチャを使用して、ルール・クラス表のrlm$rulecond
列で1つ以上のファンクション索引を定義します。参照問合せの索引を使用する場合、eventnm
引数に割り当てる値で大/小文字を区別する必要があります。
例
次のコマンドでは、ルール・クラス表とプリミティブ条件表が結合され、共有可能なプリミティブ条件への参照を持つすべてのルール条件が識別されます(問合せでは、rlm$rulecond
列で定義されているファンクション索引を使用します)。この問合せでは、FlightConditions
表に格納されている共有条件を参照するすべてのルール条件が識別されます。
select ctp.rlm$ruleid from CompTravelPromo ctp, FlightConditions fc where dbms_rlmgr.condition_ref(ctp.rlm$rulecond, 'FLT') = fc.rlm$condid;
このファンクションは、イベントをコンシュームし、対応するルールをアクションの実行用に準備します。これは、アクション(ルールの実行)がコールバックによってではなく、ユーザーのアプリケーションによって行われる場合にのみ必要です。
戻り値
このファンクションは、次の値を戻します。
1
-- イベントが正常にコンシュームされた場合
0
-- イベントが(継続時間ポリシーによって)期限切れになったか、またはこのコールの前に別のセッションによってコンシュームされた場合
使用上の注意
ルール・クラスのイベントに対してEXCLUSIVE
コンシューム・ポリシーが設定されている場合、そのイベントは、一致するルール(アクション)の実行直後にシステムから削除する必要があります。PROCESS_RULES
プロシージャをコールしてルール・アクションをルール・クラスのコールバック・プロシージャで実行する場合、イベントのコンシュームは、ルール・マネージャによって自動的に処理されます。ただし、ADD_EVENT
プロシージャを使用して、イベントとルールの一致結果をルール・クラスの結果ビューに要求する場合は、適切なアクションを実行して、ルールの実行に使用するルールとイベントの組合せを正確に示す必要があります。CONSUME_EVENT
ファンクションは、ルールの実行に使用するイベントの一意な識別子が渡されると、必要なハウスキーピング・サービスを実行します。
結果と一致するルール・クラスのフェッチと、ユーザーが開始するアクションの実行の間でタイム・ラグが発生する可能性があるため、アプリケーションでは、CONSUME_EVENT
コールで正常にイベントがコンシュームされる場合にのみこのアクションを実行する必要があります。これによって、パラレル・セッションで同じイベントがコンシュームされる競合状態を回避できます。イベントが正常にコンシュームされると、このコールは1
を戻します。その他の場合は、0
(ゼロ)を戻します。戻り値が0
(ゼロ)の場合、そのイベントは、別のセッションによってすでにコンシュームされているため、このセッションでは使用できないことを意味します。
CONSUME_EVENT
ファンクションは、EXCLUSIVE
コンシューム・ポリシーで構成されているイベントを削除します。コンシューム・ポリシーで構成されているイベントに対しては何も行いません。
ルール・クラス・レベルで決定されるEXCLUSIVE
およびSHARED
コンシューム・ポリシーとは異なり、RULE
コンシューム・ポリシーを使用して、ルールに基づいてイベントのコンシュームを決定します。つまり、ルールが一致した場合にイベントがシステムから削除されるようにルール・クラスのルールのサブセットを構成できます。同時に、その他のルール・セットでは、対応するアクションの実行後も、イベントをシステム内にそのまま残すこともできます。この場合、アプリケーション開発者が実装するアクション・コールバック・プロシージャは、(適切な引数で)CONSUME_EVENT
ファンクションをコールし、特定のルールに対するイベントを条件付きでコンシュームできます。RULE
コンシューム・ポリシー用に構成されたルール・クラスについては、「CONSUME_PRIM_EVENTSファンクション」の使用方法に関する項も参照してください。
例
次のコマンドでは、ルールの実行で使用されるイベントが識別され、その識別子を使用してイベントがコンシュームされます。
var eventid VARCHAR(40); var evtcnsmd NUMBER; BEGIN SELECT rlm$eventid INTO :eventid FROM MatchingPromos WHERE rownum < 2; -- carry the required action for a rule matched by the above event -- :evtcnsmd := DBMS_RLMGR.CONSUME_EVENT(rule_class => 'TravelPromotion', event_ident => :eventid); END;
このファンクションは、RULE
ベースのコンシューム・ポリシーで構成されたルール・クラスの場合、悉無律セマンティクスに基づいて一連のプリミティブ・イベントをコンシュームします。
構文
DBMS_RLMGR.CONSUME_PRIM_EVENTS ( rule_class IN VARCHAR2, event_idents IN RLM$EVENTIDS) RETURN NUMBER;
戻り値
このファンクションは、次の値を戻します。
1
-- すべてのイベント(渡されたイベント識別子)が正常にコンシュームされた場合
0
-- 1つ以上のプリミティブ・イベントをコンシュームできなかった場合
使用上の注意
ルール・クラスをRULE
ベースのコンシューム・ポリシー用に構成する場合は、CONSUME_PRIM_EVENTS
ファンクションを使用して、コンポジット・イベントを構成する1つ以上のプリミティブ・イベントをコンシュームします。この操作は、渡したすべてのイベントが有効で、コンシューム可能な場合にのみ正常に実行されます。ユーザーが開始するアクションは、CONSUME_PRIM_EVENTS
コールの戻り値をチェックした後で実行する必要があります。
例
次のコマンドは、RULE
コンシューム・ポリシー用に構成されたルール・クラスのアクション・コールバック・プロシージャの本体を示しています。ここでは、CONSUME_PRIM_EVENTS
ファンクションを使用して、一致するルールに対するアクションを実行する前にイベントをコンシュームする方法を示します。
create or replace procedure PromoAction ( Flt AddFlight, Flt_EvtId ROWID, --- rowid for the flight primitive event Car AddRentalCar, Car_EvtId ROWID, rlm$rule TravelPromotions%ROWTYPE) is evtcnsmd NUMBER; BEGIN evtcnsmd := DBMS_RLMGR.CONSUME_PRIM_EVENTS( rule_class => 'TravelPromotions', event_idents => RLM$EVENTIDS(Flt_EvtId, Car_EvtId)); if (evtcnsmd = 1) then -- consume operation was successful; perform the action --- OfferPromotion (Flt.CustId, rlm$rule.PromoType, rlm$rule.OfferedBy); end if; END; /
このプロシージャは、同一または異なるルール・クラスからの複数のルールによって共有可能なプリミティブ・ルール条件のリポジトリである条件表を作成します。このプロシージャはオーバーロードされています。複数の機能を構文形式ごとに、定義とともに示します。
構文
条件表を作成して、プリミティブ・イベントに対して定義されている共有可能なプリミティブ条件を格納します。
DBMS_RLMGR.CREATE_CONDITIONS_TABLE ( cond_table IN VARCHAR2, pevent_struct IN VARCHAR2, stg_clause IN VARCHAR2 DEFAULT NULL);
条件表を作成し、表の別名を使用して識別されるリレーショナル表に対して定義されている共有可能なプリミティブ条件を格納します。
DBMS_RLMGR.CREATE_CONDITIONS_TABLE ( cond_table IN VARCHAR2, tab_alias IN rlm$table_alias, stg_clause IN VARCHAR2 DEFAULT NULL);
使用上の注意
このプロシージャは、複数のルールによって共有可能なプリミティブ・ルール条件を格納するためのリレーショナル表を作成します。表はユーザー指定の名前を使用して作成されます(この表には、プリミティブ・ルール条件ごとに一意の識別子を格納するためのVARCHAR2
列(rlm$condid
)、条件式を格納するための式データ・タイプの列(rlm$condition
)、およびプリミティブ・ルール条件の記述をプレーン・テキストで格納するためのVARCHAR2
列(rlm$conddesc
)があります)。
表の作成後、条件表で標準DML操作を使用してプリミティブ・ルール条件を追加または変更できます。条件表は、pevent_struct
引数に対して指定されているプリミティブ・イベント構造を使用して(rlm$condition
列の)プリミティブ・ルール条件が検証されるように構成されます。
プリミティブ・イベント構造を使用して構成されるルール・クラスには、対応する識別子を使用して条件表の行を参照するルール条件を含めることができます。
このプロシージャは、イベント構造を作成します。
このプロシージャは、デフォルトの索引が削除されている場合に、ルール・クラスの式フィルタ索引を作成します。典型的なルール・セットがルール・クラス表に格納されている場合は、統計を収集することによって、索引をこれらの式に応じてチューニングできます。
使用上の注意
式フィルタ索引は、該当するイベントのルール・クラス内のルール条件を識別する場合に使用します。ルール・クラスの作成時に作成されるデフォルトの索引は、イベント構造のスカラー属性に関連する述語のタイプ(等価性、非等価性など)がすべて同様であることを想定しています。ルール・クラスのパフォーマンスは、特定のワークロードに対する式フィルタ索引をチューニングすることによって改善できます。これを行うには、典型的なワークロードで統計を収集するか、またはドメインに関する知識を利用して最も一般的な述語構成を識別します。
ルール・クラスに対して作成されるデフォルトの式フィルタ索引は、DBMS_RLMGR.DROP_EXPFIL_INDEXES
プロシージャを使用して削除できます。この索引は、削除した後でもDBMS_RLMGR.CREATE_EXPFIL_INDEXES
プロシージャを使用して再作成できます。CREATE_EXPFIL_INDEXES
プロシージャのcoll_stats
引数をYES
に設定すると、最も一般的な述語構成のルール条件統計が収集され、これらの統計を使用して索引が作成されます。または、ドメインについて詳しいユーザーが、最も一般的な述語構成と特有の述語構成を識別して手動で索引パラメータを設定し、これらのパラメータを使用して索引を作成することもできます。索引パラメータは、ルール・クラスに関連付けられている各プリミティブ・イベント構造に対して設定できます。索引パラメータは、DBMS_EXPFIL.DEFAULT_INDEX_PARAMETERS
プロシージャを使用してイベント構造(式フィルタ属性セット)に割り当てることができます。CREATE_EXPFIL_INDEXES
プロシージャのcoll_stats
引数をNO
に設定すると、ルール・クラスに対して作成された式フィルタ索引は、各プリミティブ・イベント構造に関連付けられているデフォルトの索引パラメータを使用します。(パフォーマンスを改善するための式フィルタ索引のチューニングに関する詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』の式の索引作成に関する項を参照してください。)
関連ビュー: USER_EXPFIL_DEF_INDEX_PARAMS
。
例
次のコマンドでは、CompTravelPromo
ルール・クラスで定義されているルールの統計が収集され、セット内で最も一般的な述語に基づく式フィルタ索引が作成されます。
BEGIN DBMS_RLMGR.CREATE_EXPFIL_INDEXES (rule_class => 'CompTravelPromo', coll_stats => 'yes'); END; /
次は式フィルタのチューニング例であり、ドメインに関する知識を使用して特定の索引パラメータを割り当てています。次のコマンドでは、特定の索引パラメータがAddFlight
イベント構造に関連付けられ、これに応じて、対応する式に対して作成された式フィルタ索引が最適化されます。その後のCREATE_EXPFIL_INDEXES
のステップでは、これらの索引パラメータを使用します。
BEGIN DBMS_EXPFIL.DEFAULT_INDEX_PARAMETERS('AddFlight', exf$attribute_list ( exf$attribute (attr_name => 'Airline', attr_oper => exf$indexoper('='), attr_indexed => 'TRUE'), exf$attribute (attr_name => 'ToCity', attr_oper => exf$indexoper('='), attr_indexed => 'TRUE'), exf$attribute (attr_name => 'Depart', attr_oper => exf$indexoper('=','<','>','>=','<='), attr_indexed => 'FALSE') ) ); -- create the indexes after assigning the index parameters -- DBMS_RLMGR.CREATE_EXPFIL_INDEXES (rule_class => 'CompTravelPromo'); END; /
このプロシージャは、ルール・クラスを直接操作できるルール・クラス・インタフェースのパッケージを作成して、効率性および使いやすさを改善します。
使用上の注意
ランタイム操作(イベントのルールの処理、イベントのコンシューム、セッションのリセットなど)で使用するDBMS_RLMGR
プロシージャの共通セットは、引数の1つとして渡されるルール・クラス名を使用し、この名前をルール・クラスの対応する操作に関連付けます。このステップでのオーバーヘッドは、ルール・クラスを直接操作する場合に使用するルール・クラス・インタフェースのパッケージを作成することによって回避できます。
ルール・クラス・インタフェースのパッケージは、ルールの処理(PROCESS_RULES
)、イベントの追加(ADD_EVENT
)、イベントのコンシューム(CONSUME_EVENT
、CONSUME_PRIM_EVENTS
)、ルール・セッションのリセット(RESET_SESSION
)を行うためのプロシージャおよびファンクションが含まれるPL/SQLパッケージです。これらのプロシージャおよびファンクションの操作上の特徴は、2つの点を除き、一致する名前を持つDBMS_RLMGR
プロシージャおよびファンクションの特徴と同じです。ルール・クラス・インタフェースのパッケージは特定のルール・クラスに対して作成されるため、ルール・クラス名は暗黙的であり、ルール・クラス・インタフェースのパッケージのプロシージャおよびファンクションのルール・クラス名の引数として渡す必要がありません。また、ルール・クラス・インタフェースのパッケージには、ルール・クラスを使用して構成される各プリミティブ・イベント・タイプを受け入れるPROCESS_RULES
およびADD_EVENT
という個別のプロシージャが含まれます。これは、イベント・インスタンスをVARCHAR
インスタンスまたはAnyData
インスタンスとしてのみ受け入れるように一般化されているDBMS_RLMGR
パッケージ内の同じプロシージャとは対照的です。
例
次のコマンドでは、CompTravelPromo
ルール・クラスに対してルール・クラス・インタフェースのパッケージが作成されます。
BEGIN DBMS_RLMGR.CREATE_INTERFACE (rule_class => 'CompTravelPromo', interface_nm => 'TravelPromoRules'); END;
次のコマンドでは、前のステップで作成されたインタフェースを使用して、AddFlight
イベントのインスタンスのルールが処理されます。
BEGIN TravelPromoRules.process_rules (event_inst => AddFlight(987, 'Abcair', 'Boston', 'Orlando', '01-APR-2009', '08-APR-2009'); END;
このプロシージャは、ルール・クラスを作成します。
構文
DBMS_RLMGR.CREATE_RULE_CLASS ( rule_class IN VARCHAR2, event_struct IN VARCHAR2, action_cbk IN VARCHAR2, actprf_spec IN VARCHAR2 default null, rslt_viewnm IN VARCHAR2 default null, rlcls_prop IN VARCHAR2 default <simple/>);
パラメータ
表124-13 CREATE_RULE_CLASSプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
現行のスキーマ内に作成するルール・クラスの名前。 |
|
ルール・クラスのイベント構造を表す、現行のスキーマ内のオブジェクト・タイプまたは式フィルタの属性セットの名前。 |
|
ルール・クラスに対して作成するアクション・コールバック・プロシージャの名前。 |
|
ルール・クラスに関連付けられているアクション・プリファレンスの仕様(名前とSQLデータ・タイプの組合せ)。 |
|
セッション内の一致するイベントとルールが表示されるルール・クラスの結果ビューの名前。この名前のビューが現行のスキーマ内に作成されます。 |
|
ルール・クラスのプロパティを設定するためのXML文書。デフォルトでは、ルール・クラスは単純イベント(非コンポジット)用に作成されます。 |
使用上の注意
ルール・クラスを正常に作成するには、ビュー、オブジェクト・タイプ、表、パッケージおよびプロシージャを作成するための十分な権限が必要です。
このコマンドは、ルール・クラスおよびその依存オブジェクトをユーザーのスキーマ内に作成します。この操作を正常に実行するには、イベント構造に指定する名前が、ユーザーのスキーマ内の既存のオブジェクト・タイプまたは式フィルタ属性セットを指している必要があります。イベント構造にオブジェクト・タイプを使用すると、CREATE_RULE_CLASS
プロシージャは、オブジェクト・タイプの属性セットを暗黙的に作成します。また、コンポジット・イベント用に構成されるルール・クラスの場合、このプロシージャは、イベント構造のオブジェクト・タイプ(または属性セット)に直接組み込まれるオブジェクト・タイプの属性セットも作成します。コンポジット・ルール・クラスで使用されるイベント構造では、最大32個の埋込みオブジェクトまたは表の別名(あるいはその両方)を指定できます。このプロシージャで作成される依存オブジェクトのタイプおよび構造は、ルール・クラスおよびそのイベント構造のプロパティによって異なります。ルール・クラスに対して作成される最小セットの依存オブジェクトは、次のとおりです。
ルール・クラス表 - ルールの定義(ルール識別子、ルール条件、ルールの説明およびアクション・プリファレンス)を格納するために、ルール・クラスと同じ名前のルール・クラス表がユーザーのスキーマ内に作成されます。この表には、rlm$ruleid
、rlm$rulecond
、rlm$enabled
およびrlm$ruledesc
の4つの列が暗黙的に含まれ、ルール識別子、ルール条件、ルールの状態、ルールの説明がそれぞれ格納されます。ルール・クラス表には、これらの4つの列に加えて、ルール・クラスのアクション・プリファレンス仕様に基づくいくつかの列があります。たとえば、ルール・クラスTravelPromotionでそのアクション・プリファレンス仕様(actpref_spec
引数に割当て)として'PromoType VARCHAR
(20), OfferedBy VARCHAR
(20)'が使用される場合は、次の構造を持つルール・クラス表が作成されます。
TABLE TravelPromotion ( rlm$ruleid VARCHAR(100), -- rule identifier column -- PromoType VARCHAR(20), -- action preference 1 -- OfferedBy VARCHAR(20), -- action preference 2 -- rlm$rulecond VARCHAR(4000), -- rule condition –- rlm$ruledesc VARCHAR(1000), -- rule description -- rlm$enabled CHAR(1)); -- rule status --
ルール・クラス表の構造は、そのルール・クラスに対して指定されたアクション・プリファレンス・カテゴリのリストに厳密に基づき、ルール・クラスごとに異なります。
アクション・コールバック・プロシージャ - 指定した名前のアクション・コールバック・プロシージャのスケルトンがユーザーのスキーマ内に作成され、ルール・クラスに関連付けられます。コールバック・プロシージャは、ルールの評価時に、一致するルールとイベントごとにコールされます。各ルールに対して適切なアクションを実行するには、アクション・コールバック・プロシージャの本体を実装する必要があります。ルールに対して実行するアクションは、そのルールに一致したイベント、ルール定義、およびそのアクション・プリファレンスに基づいて厳密に決定できます。この情報は、引数によってアクション・コールバック・プロシージャに渡されます。したがって、アクション・コールバック・プロシージャの引数リストは、ルール・クラスに関連付けられたイベント構造およびルール・クラス自体によって異なります。
単純イベント(ルール・クラスのプロパティに割り当てられた<simple/>
)用に構成されているルール・クラスの場合、ルールに一致するイベントは、イベント構造と同じタイプとして宣言されるrlm$event
引数によって渡されます。また、ルール定義は、対応するルール・クラス表のROWTYPEとして宣言されるrlm$rule
引数を使用してアクション・コールバック・プロシージャに渡されます。たとえば、単純な(非コンポジットの)イベント構造AddFlight
に対して構成されるルール・クラスTravelPromotion
用のアクション・コールバック・プロシージャPromoAction
は、次のような構造で作成されます。
PROCEDURE PromoAction (rlm$event AddFlight, rlm$rule TravlePromotion%ROWTYPE);
コンポジット・イベント(ルール・クラスのプロパティに割り当てられた<composite/>
)用に作成されたルール・クラスの場合は、各プリミティブ・イベントを別々の引数として渡すようにアクション・コールバック・プロシージャを作成します。たとえば、プリミティブ・イベントAddFlight
およびAddRentalCar
を持つコンポジット・イベントに対して構成されるルール・クラスCompTravelPromo
用のアクション・コールバック・プロシージャCompPromoAction
は、次のような構造で作成されます。
-- composite event structure -- TYPE TSCompEvent (Flt AddFlight, Car AddRentalCar); -- corresponding action callback procedure -- PROCEDURE PromoAction (Flt AddFlight, Car AddRentalCar, rlm$rule CompTravelPromo%ROWTYPE)
ルール・クラスがRULE
コンシューム・ポリシーに対して構成されているか、またはルール・クラスが1つ以上のコレクション・イベントに対して有効になっている場合、アクション・コールバック・プロシージャには追加の引数が含まれます。この場合、引数には、イベント識別子(ROWID
データ・タイプ)およびイベント・インスタンスが含まれます。これらのイベント識別子を使用して、一致するルールをさらに操作することができます。たとえば、ルールのコンシュームに対して構成されているルール・クラスでは、イベント識別子を使用して、DBMS_RLMGR.CONSUME_PRIM_EVENTS
ファンクションでイベントをコンシュームできます。コレクション・イベントに対して有効になっているルール・クラスでは、コレクション・イベントの同じ識別子を使用して、DBMS_RLMGR.GET_AGGREGATE_VALUE
ファンクションで特定の集計値をフェッチできます。
ルール・クラスの結果ビュー - イベントとルールの一致結果を表示するビューが、ルール・クラスと同じスキーマ内に作成されます。デフォルトでは、このビューは、システム生成された名前で作成されます。オプションで、ルール・クラスの作成者が、このビューの名前をCREATE_RULE_CLASS
プロシージャのrlst_viewnm
引数で指定することもできます。ADD_EVENT
プロシージャを使用して、ルール・セッション内のルール・マネージャにイベントを追加すると、一致するイベントとルールのリストがルール・クラスの結果ビューに表示されます。
ルール・クラスの結果に対して定義されるビューの構造は、ルール・クラスに対して構成されるイベント構造およびアクション・プリファレンスによって異なります。このビューには3つ以上の列が含まれ、システム生成されたイベント識別子(rlm$evenetid
)、そのイベントに一致するルールの識別子(rlm$ruleid
)およびルール条件(rlm$rulecond)が表示されます。また、イベント情報およびルール・アクション・プリファレンスを表示する列も含まれます。
イベント情報は、単純イベント用に構成されたルール・クラスの場合、イベント構造のタイプとして宣言されるrlm$eventとして表示されます。したがって、単純なイベント構造AddFlight
に対して構成されるルール・クラスTravelPromotion
用のビューMatchingPromos
は、次のように作成されます。
VIEW MatchingPromos ( rlm$eventid ROWID, rlm$event AddFlight, rlm$ruleid VARCHAR(100), PromoType VARCHAR(30), -- action preference 1 -- OffredBy VARCHAR(30), -- action preference 2 -- rlm$rulecond VARCHAR(4000), rlm$ruledesc VARCHAR(1000) );
コンポジット・イベント用に構成されるルール・クラスの場合は、ルールに一致したプリミティブ・イベントが、対応する列に別々に表示されます。前述のルール・クラスCompTravelPromo
の場合、ビューMatchingCompPromos
は、次の構造で作成されます。
VIEW MatchingCompPromos ( rlm$eventid ROWID, Flt AddFlight, Car AddRentalCar, rlm$ruleid VARCHAR(100), PromoType VARCHAR(30), -- action preference 1 -- OffredBy VARCHAR(30), -- action preference 2 -- rlm$rulecond VARCHAR(4000), rlm$ruledesc VARCHAR(1000) );
rlm$eventid列の値は、対応するルールの実行時に、ルール・クラスのコンシューム・ポリシーを適用するために使用されます。詳細は、「CONSUME_EVENTファンクション」を参照してください。
例
次のコマンドでは、単純イベント(AddFlight
タイプ)用のルール・クラスが作成されます。
CREATE or REPLACE TYPE AddFlight AS OBJECT ( CustId NUMBER, Airline VARCHAR(20), FromCity VARCHAR(30), ToCity VARCHAR(30), Depart DATE, Return DATE); BEGIN DBMS_RLMGR.CREATE_RULE_CLASS ( rule_class => 'TravelPromotion', -- rule class name -- event_struct => 'AddFlight', -- event struct name -- action_cbk => 'PromoAction', -- callback proc name –- rslt_viewnm => 'MatchingPromos', -- results view -- actprf_spec => 'PromoType VARCHAR(20), OfferedBy VARCHAR(20)'); END;
次のコマンドでは、2つのプリミティブ・イベント(AddFlight
およびAddRentalCar
)で構成されるコンポジット・イベント用のルール・クラスが作成されます。
CREATE or REPLACE TYPE TSCompEvent (Flt AddFlight, Car AddRentalCar); BEGIN DBMS_RLMGR.CREATE_RULE_CLASS ( rule_class => 'CompTravelPromo', -- rule class name -- event_struct => 'TSCompEvent', -- event struct name -- action_cbk => 'CompPromoAction', -- callback proc name –- rslt_viewnm => 'MatchingCompPromos', -- results view -- actprf_spec => 'PromoType VARCHAR(20), OfferedBy VARCHAR(20)', properties => '<composite/>'); END;
このプロシージャは、ルール・クラスからルールを削除します。
使用上の注意
このプロシージャを使用して、ルール・クラスからルールを削除します。削除するルールの識別子は、(ルール・クラスと同じ名前の)ルール・クラス表を問い合せることによって取得できます。また、ルール・クラスの所有者は、1つのルール・クラス表に対してSQL DELETE
文を使用してルールを削除することができます。スキーマ拡張した名前をルール・クラスに使用する場合は、ルール・クラスに対するDELETE
RULE
権限が必要です。詳細は、「GRANT_PRIVILEGEプロシージャ」を参照してください。
注意: DELETE_RULE プロシージャではなくSQL DELETE 文を使用してルールを削除する場合、ルール・クラスのAUTOCOMMIT プロパティは無視されます。 |
ルール・クラス表の構造については、「CREATE_RULE_CLASSプロシージャ」を参照してください。
このプロシージャは、条件表を削除します。
このプロシージャは、ルール・クラスに対して作成された式フィルタ索引を削除します。
このプロシージャは、ルール・クラスを削除します。
このプロシージャは、新しい属性を追加することによって、1つ以上のルール・クラスで使用されるプリミティブ・イベント構造を拡張する場合に使用します。
構文
DBMS_RLMGR.EXTEND_EVENT_STRUCT ( event_struct IN VARCHAR2, attr_name IN VARCHAR2, attr_type IN VARCHAR2, attr_defvl IN VARCHAR2 default NULL);
使用上の注意
このプロシージャは、新しい属性が含まれるように、ルール・クラスにすでに関連付けられているプリミティブ・イベント構造を拡張します。このプロシージャは、主に、完全に開発されたルール・アプリケーションに移行して、拡張されたイベント構造を使用する場合に使用できます(これをADD_ELEMENTARY_ATTRIBUTE
コールのかわりに使用しないでください)。一度に1つのイベント構造の属性を構築するADD_ELEMENTARY_ATTRIBUTE
コールとは異なり、EXTEND_EVENT_STRUCT
コールは、新しい属性が含まれるように、イベント構造に関連付けられているオブジェクト・タイプを進化させて、依存オブジェクトに対していくつかのメンテナンス操作を実行します。
EXTEND_EVENT_STRUCT
コールの使用方法は、同じ引数セットが指定されているADD_ELEMENTARY_ATTRIBUTE
と似ています。表の別名の属性およびテキストと空間データ・タイプの属性は、EXTEND_EVENT_STRUCT
コールを使用してイベント構造に追加することはできません。
このファンクションは、コレクション・イベントに対して計算された集計値を取り出します。
構文
DBMS_RLMGR.GRANT_PRIVILEGE ( rule_class IN VARCHAR2, event_ident IN VARCHAR2, aggr_func IN VARCHAR2) RETURN VARCHAR2;
使用上の注意
collection
構成を持つルール条件がイベント・セットと一致する場合は、コレクション・イベントを表すインスタンスおよびシステムによって生成されたコレクション・イベントの識別子がアクション・コールバック・プロシージャに渡されます。このイベント識別子は、コレクション・イベント評価の一部として計算される集計値をフェッチする場合に使用できます。
集計関数は、ルール条件のコレクション構成内のHAVING
句またはCOMPUTE
句に含めることができます。たとえば、次のルール条件では、sum(amount)
、count(*)
およびmax(amount)
に対して3つの集計値が計算されます。アクションを実行するときに、同じsubjectId
(イベントがグループ化される属性)を持つBankTransaction
のすべてのインスタンスを表すコレクション・イベントの識別子を使用して、これらの値を取得できます。
<condition> <collection name="bank" groupby="subjectId" having="sum(amount) > 10000" compute="max(amount), count(*)"/> </condition>
集計関数のシグネチャは、GET_AGGREGATE_VALUE
ファンクションのaggr_func
引数にバインドされており、特定の集計値をフェッチします。値がNUMBER
データ・タイプまたはDATE
データ・タイプである場合、対応するVARCHAR
表現が戻されます。コレクション・イベントの一部として計算されない集計値をフェッチしようとすると、NULL
値が戻されます。
例
次の例は、アクションの実行の一部として、計算された集計値を出力するアクション・コールバック・プロシージャのサンプル実装を示しています。この場合、BankTransaction
プリミティブ・イベントはコレクションに対して有効になっています。
CREATE OR REPLACE PROCEDURE LAWENFORCEMENTCBK ( bank banktransaction, bankcollid rowid, transport transportation, fldrpt fieldreport, rlm$rule LawEnforcementRC%ROWTYPE) IS aggrval VARCHAR(30); begin dbms_ouput.put_line('Mathing Rule :'||rlm$rule.rlm$ruleid||chr(10)); if (bank is not null) then dbms_ouput.put_line('-->Bank Transactions by ('||bank.subjectId||')'||chr(10); aggrval := dbms_rlmgr.get_aggregate_value(rule_class =>'LawEnforcementRC', event_ident => bankcollid, aggr_func => 'sum(amount)'); if (aggrval is not null) then dbms_ouput.put_line('---> Sum of the amounts is :'||aggrval||chr(10)); end if; . . . end if; end;
このプロシージャは、ルール・クラスに対する権限を他のユーザーに付与します。
構文
DBMS_RLMGR.GRANT_PRIVILEGE ( rule_class IN VARCHAR2, priv_type IN VARCHAR2, to_user IN VARCHAR2);
使用上の注意
このプロシージャは、ルール・クラスの所有者ではないユーザーに権限を付与します。ユーザーに付与できる権限のタイプは、次のとおりです。
PROCESS
RULES
: ルール・クラスに対するPROCESS
RULES
権限を持つユーザーは、PROCESS_RULES
プロシージャまたはADD_EVENT
プロシージャを使用して、そのルール・クラスのルールを処理できます。また、この権限を持つユーザーは、対応するルール・クラスの結果ビューを検索できます。
ADD
RULE
: ルール・クラスに対するADD
RULE
権限を持つユーザーは、そのルール・クラスにルールを追加できます。また、ルール・クラスの所有者は、1つのルール・クラス表に対するINSERT
権限を他のユーザーに付与することもできます。
DELETE
RULE: ルール・クラスに対するDELETE
RULE
権限を持つユーザーは、そのルール・クラスからルールを削除できます。また、ルール・クラスの所有者は、1つのルール・クラス表に対するDELETE
権限を他のユーザーに付与することもできます。
ALL
: ルール・クラスに対するALL
権限を付与すると、そのルール・クラスに対する前述のすべての権限がユーザーに付与されます。
ルール・クラスの所有者は、ルール・クラスの削除、ルール・クラス内のルールの処理、ルール・クラスに対するルールの追加と削除を実行する権限を常に所有しています。ルール・クラスの所有者のみがルール・クラスを削除でき、この権限は、他のユーザーには付与できません。
ユーザーがルール・クラスの結果ビューを利用する前に、対応するルール・クラスに関連付けられているプリミティブ・イベント・タイプに対するEXECUTE
権限が必要です。
このプロシージャは、指定したイベントのルールを処理します。このプロシージャはオーバーロードされています。複数の機能を構文形式ごとに、定義とともに示します。
構文
ルール・クラスに追加するイベント・インスタンスの文字列表現に対するルールを処理します。
DBMS_RLMGR.PROCESS_RULES ( rule_class IN VARCHAR2, event_inst IN VARCHAR2, event_type IN VARCHAR2 default null);
ルール・クラスに追加するイベント・インスタンスのAnyData表現に対するルールを処理します。
DBMS_RLMGR.PROCESS_RULES ( rule_class IN VARCHAR2, event_inst IN sys.AnyData);
使用上の注意
このプロシージャは、event_inst
引数に割り当てられたイベント・インスタンスに対するルール・クラス内のルールの処理に使用します。
単純イベント(非コンポジット)用に構成されるルール・クラスの場合、イベント・インスタンスは、対応するイベント構造がインスタンス化されたものです。ルールは(最終的に)このイベントに対して評価され、一致するルールごとに、対応するアクション・コールバック・プロシージャがコールされます。イベントに一致するルールがない場合、それ以降、アクションは実行されません。イベントが複数のルールに一致する場合は、ルール・クラスに対して構成されている順序付け句に基づいて、ルールの順序が決定され、アクション・コールバック・プロシージャが起動されます。ルール・クラスがEXCLUSIVE
コンシューム・ポリシーに対して構成されている場合、最初のルールがこの順序で実行され、対応するアクション・コールバック・プロシージャがコールされると、イベントに一致する残りのルールは無視されます。
コンポジット・イベント用に構成されているルール・クラスの場合、event_inst
引数に割り当てられたイベント・インスタンスは、コンポジット・イベント内のプリミティブ・タイプのイベントがインスタンス化されたものです。インスタンスを文字列として表現する場合は、対応するタイプ名をevent_type
引数に割り当てる必要があります。コンポジット・イベント用に構成されているルール・クラスに対するPROCESS_RULES
コールは、ルール・クラスの状態およびルール・クラスのルールの種類に応じて、様々なアクションを実行します。次の点に注意してください。
渡されたプリミティブ・イベントに対してのみ適用されるルールが最終的に評価され、前述のとおり、一致するルールに対してアクション・コールバック・プロシージャがコールされます。
複数のプリミティブ・イベントに対して適用されるルールの場合、PROCESS_RULES
プロシージャで渡されるイベント・インスタンスは、ルールの一部にのみ一致する可能性があります。
ルールの残りの部分に一致するプリミティブ・イベント・インスタンスが他にある場合、現行のイベント・インスタンスが他のインスタンスと組み合され、ルール・クラスのルールに一致する完全なコンポジット・イベントが形成されます。したがって、PROCESS_RULES
プロシージャのevent_inst
引数に割り当てられたイベント・インスタンスは、他の様々な(処理済の)プリミティブ・イベントと組み合せられ、1つ以上のルールが最終的に評価される可能性があります。ルール・クラスのアクション・コールバック・プロシージャは、プリミティブ・イベント(コンポジット・イベント)とルールで構成される組合せごとにコールされます。アクション・コールバック・プロシージャの起動時、ルール・クラスの順序付け句およびプリミティブ・イベントに対するコンシューム・ポリシーが考慮されます。
ルールの残りの部分に一致する他のプリミティブ・イベントがない場合、現行のイベント・インスタンスおよびその(増分の)評価結果がデータベースに記録されます。これらの結果は、ルール・クラスで使用される継続時間ポリシーに基づいてイベントがコンシュームされるか、またはシステムから削除されるまで保持されます。
例
次のコマンドでは、指定したイベントのルール・クラスTravelPromotion
のルールが処理されます。
BEGIN DBMS_RLMGR.PROCESS_RULES ( rule_class => 'TravelPromotion', event_inst => AddFlight.getVarchar(987, 'Abcair', 'Boston', 'Orlando', '01-APR-2003', '08-APR-2003')); END;
次のコマンドでは、示されている2つのプリミティブ・イベントのルール・クラスCompTravelPromo
のルールが処理されます。
BEGIN DBMS_RLMGR.PROCESS_RULES( rule_class => 'CompTravelPromo', event_inst => AddFlight.getVarchar(987, 'Abcair', 'Boston', 'Orlando', '01-APR-2003', '08-APR-2003'), event_type => 'AddFlight'); DBMS_RLMGR.PROCESS_RULES( rule_class => 'Scott.CompTravelPromo', event_inst => AnyData.convertObject(AddRentalCar(987, 'Luxury', '03-APR-2003', '08-APR-2003', NULL))); END;
このプロシージャは、ルール・クラスに関連付けられているすべてのイベントを削除し、いくつかのイベントに一致するルールに関する状態情報をパージすることによって、ルール・クラスで保持されている増分状態をリセットします。
このプロシージャは、新しいセッションを開始し、ルール・クラスの結果ビュー内の結果を破棄します。
使用上の注意
ADD_EVENT
プロシージャを使用してルール・クラスにイベントを追加すると、イベントと一致するルールの結果がルール・クラスの結果ビューに記録されます。デフォルトでは、これらの結果は、データベース・セッションの終了時にリセットされます。また、RESET_SESSIONプロシージャを使用して、リセットを行い、同じデータベース・セッション内で新しいルール・セッションを開始することもできます。このプロシージャは、ADD_EVENTプロシージャを使用してルールを評価する場合にのみ適用できます。
このプロシージャは、他のユーザーが持つルール・クラスに対する権限を取り消します。
構文
DBMS_RLMGR.REVOKE_PRIVILEGE ( rule_class IN VARCHAR2, priv_type IN VARCHAR2, from_user IN VARCHAR2);
使用上の注意
このプロシージャは、ユーザーに付与されている権限を取り消します。取り消すことができる権限のタイプは、「GRANT_PRIVILEGEプロシージャ」に示されている権限のタイプと同じです。ルール・クラスの所有者が持つルール・クラスに対する権限は取り消すことができません。
このプロシージャは、ルール条件のCONTAINS
演算子に関連する述語を処理するために定義された索引を同期化します。
使用上の注意
ルール・クラスが1つ以上のテキスト属性を持つイベントに対して構成されている場合、対応するルール条件内のテキスト述語は、CTXRULE
索引を使用して処理されます。ルール条件内の他のタイプの述語を処理する場合に使用される他のタイプの索引(スカラーおよびXML述語用のビットマップ索引、または空間述語用の空間索引)とは異なり、CTXRULE
索引にトランザクションの特性はありません。つまり、ルール条件内のテキスト述語がデータベース・トランザクションで変更された場合、新しい述語は対応するCTXRULE
索引に自動的には反映されません。このため、イベントとルール条件の一致で、結果に一貫性がなくなることがあります。ルール・クラスに関連付けられているすべてのCTXRULE
索引は、このプロシージャを使用して最新のルール条件に同期化できます。
テキスト索引を正常に同期化するには、CTX_DDL
パッケージに対するEXECUTE
権限が必要です。