作成時に指定されるルール・クラス・プロパティには、ルール・マネージャが各ルール・アプリケーションに対して実施するイベント管理ポリシーが含まれています。コンポジット・イベント構造に対して定義されるルールの場合、プリミティブ・イベントは一度に1つずつシステムに追加されます。これらのイベントは、その後、他のプリミティブ・イベントと結合され、1つ以上のルール条件を満たすコンポジット・イベントを形成します。各プリミティブ・イベント間の結合条件に基づいて、プリミティブ・イベントに他のイベントとの1対1、1対N (1対多)またはN 対M (多対多)の関連を指定して、1つ以上のコンポジット・イベントを形成できます。プリミティブ・イベントを再利用したり、重複するコンポジット・イベントを処理するためのアプリケーション固有の要件は、ルール・イベント管理ポリシーを使用してサポートされます。これらのプロパティは、次のように大まかに分類されます。
使用率: イベントを複数のルール実行に対して使用できるか、または単一のルール実行に対してのみ使用できるかを決定します。
競合解消(順序付け): 様々なイベントとのルール照合の実行順序を決定します。
継続時間: 使用されていないプリミティブ・イベントの存続期間を決定します。
自動コミット: ルール・クラスを使用する各相互作用を自動的にコミットするかどうかを決定します。
記憶域: データベース内のルール・クラスの記憶域特性を決定します。
等価: ルール・クラス内のすべてのルールに対して共通の等価性結合述語を指定します。つまり、ルール・クラスに対して構成されたコンポジット・イベント内で等価であるプリミティブ・イベント属性のリストを指定します。
DMLイベント: イベント構造が1つ以上の表別名属性を使用して作成されるときに指定します。対応する表のDML操作(INSERT、UPDATE、DELETE
)がルールの評価対象のイベントとみなされるように、対応するルール・クラスを構成できます。DMLイベント仕様では、コミットされていないトランザクションからのDMLイベントを使用してルールを処理します。ただしCNFイベントの場合は、トランザクションがコミットされた後、トランザクション内でDML操作のためにルールが処理されます。
イベント管理ポリシーのduration
(継続時間)およびequal
(等価)は、コンポジット・イベントに対して構成されたルール・クラスにのみ適用できます。他のすべてのポリシーは、コンポジット・イベントに対して構成されたルール・クラスおよび単純イベントに対して構成されたルール・クラスに適用できます。イベント管理ポリシーに加えて、ルール・クラス・プロパティによりイベントのコレクション用の仕様が許可されます。個別イベントとは対照的に、コレクションの仕様では、プリミティブ・イベントをコレクション・イベントに関係するルール条件で使用できます。このようなイベントに対して、ルール条件では、有限でありながら多数となる可能性のある同じタイプのプリミティブ・イベントの集計値を計算し、集計結果で述語を指定します。特定のタイプのプリミティブ・イベントは一定のイベント属性および集計演算子に基づいてグループ化され、他の属性上にあるSUM、AVG、MIN、MAX、COUNTなどは述語の適用に使用されます。
すべてのルール・クラス・プロパティは、XMLプロパティ文書で指定され、ルール・クラス作成プロシージャ(dbms_rlmgr.create_rule_class
)の引数の1つ(rlcls_prop
)として使用されされます。コレクションを使用可能にするルール・クラス・プロパティについては、第4.8項で説明します。その他のすべてのルール・クラス・プロパティについては、次の項で説明します。
コンポジット・イベントの形成に使用されるプリミティブ・イベントは、他のプリミティブ・イベントと結合して別のコンポジット・イベントを形成できます。たとえば、AddFlight
イベントの2つのインスタンスをAddRentalCar
イベントの1つのインスタンスと結合して、(2つの異なるルールと一致する)異なる2つのコンポジット・イベントを形成できます。一部のルール・アプリケーションでは、プリミティブ・イベントがそれ自体のルールまたは他のプリミティブ・イベントと結合したルールと一致する必要があるため、それ以外のルール実行には使用しないでください。コンポジット・イベントの形成に使用されるプリミティブ・イベントは、システムで使用または削除されます。ルール・クラスのconsumption
(使用率)プロパティは、システム内でのプリミティブ・イベントの再利用に関係するポリシーを決定します。使用率ポリシーは、単純イベントに対して定義されたルールとコンポジット・イベントに対して定義されたルールの両方に適用できます。次の2種類のモードのイベント使用率が考えられます。
EXCLUSIVE(排他): 使用率のモードがEXCLUSIVE
の場合は、プリミティブ・イベントを使用して1つのルール(常に最初に一致するルール)と照合できます。対応するルール・アクションが実行されると、イベント継続時間の仕様(TRANSACTION
、SESSION
または経過時間
)に関係なく、このイベントはシステムから削除されます。
SHARED(共有): 使用率のモードがSHARED
の場合は、プリミティブ・イベントを使用して複数のルールと照合し、それらのアクションを実行できます。プリミティブ・イベントは、イベント継続時間の仕様に一致した場合のみ、システムから削除されます。使用率プロパティなしで作成されたルール・クラスのデフォルトの使用率ポリシーは、SHARED
です。
以前に使用した同じ例に従って、2つのAddFlight
イベントがシステムにすでに追加されている場合、次のAddRentalCar
イベントは、2つ以上のルールと一致する可能性のある2つのコンポジット・イベントを形成できます。ルール・クラスがイベントを排他(EXCLUSIVE
)使用するように構成されている場合は、コンポジット・イベントの1つを使用して、1つのルール・アクションのみを実行できます。適切な競合解消方法が採用されている場合は、このルールを確定的に選択できます(第3.2項を参照)。
単純イベント構造に対して作成されたルール・クラスのEXCLUSIVE
使用率ポリシーは、dbms_rlmgr.process_rules
プロシージャに渡されるイベント・インスタンスに対して、1つのルールが実行されることを意味します。イベントが複数のルールと一致する場合、実行対象として選択されるルールは、ルール・クラスの順序付けプロパティを使用して判断されます(順序付けの詳細は第3.2項を参照)。プリミティブ・イベント構造に対して作成されたルール・クラスは、次のXMLプロパティ文書を使用して(dbms_rlmgr.create_rule_class
プロシージャへのrlcls_prop
引数として)、EXCLUSIVE
イベント使用率ポリシー付きで構成できます。
<simple consumption="exclusive"/>
ルール・クラス・プロパティ内の使用率仕様に有効なその他の形式は、次のとおりです。
<composite consumption="exclusive"/> <composite consumption="shared"/>
ルール・アプリケーションでは、コンポジット・イベントで使用されるプリミティブ・イベントのサブセット用プリミティブ・イベントの再利用に、異なるポリシーを保持できます。このようなアプリケーションでは、次のように各プリミティブ・イベント・タイプについて<composite>
要素の子要素として使用率ポリシーを指定できます。
<composite consumption="shared"> <object type="AddFlight" consumption="shared"> <object type="AddRentalCar" consumption="exclusive"> </composite>
<composite>
要素のconsumption
属性の値は、コンポジット・イベントのすべてのプリミティブ・イベントのデフォルト値として使用されます。プリミティブ・イベント・タイプのデフォルト値は、<composite>
要素の子要素としてプリミティブ・イベントを指定し、この要素に使用率属性を指定することで上書きされます。
イベント使用率のカスタム・ロジックの指定
EXCLUSIVE
およびSHARED
の使用率ポリシーに加え、RULE
使用率ポリシーを使用してコンポジット・イベントのルール・クラスを構成できます。これにより、ルール・クラスで個別のルールを指定し、イベント使用率のカスタム・ロジックを使用できます。RULE
使用率ポリシーは、コンポジット・イベント・レベルでのみ指定できます。指定した場合は、プリミティブ・イベント・タイプの使用率ポリシーをEXCLUSIVE
に設定することはできません。RULE
使用率ポリシーに対してルール・クラスが構成されている場合は、アクション・コールバック・プロシージャおよびルール・クラス結果ビューが作成され、ルールと一致する各プリミティブ・イベントの識別子が戻ります。これらの識別子を基本単位として使用し、プリミティブ・イベントの一部またはすべてを選択的に使用できます。詳細は、「DBMS_RLMGR.CONSUME_PRIM_EVENTS
プロシージャ」を参照してください。
あるイベントが、それ自体のルールまたは他のプリミティブ・イベントと結合したルールと一致した場合、デフォルトでは、ルール(アクション)実行順序は確定的ではありません。一部のルール・アプリケーションには、特定の順序で実行するための一致ルールが必要です。実行順序は競合解消基準によって決定されます。また、EXCLUSIVE(排他)イベント使用率の場合は、1つの一致ルールのみが実行されます。なんらかの競合解消基準が指定されていない場合は、このルールが無作為に選択されます。一般的な競合解消方法の1つは、イベント属性値とルール・アクション・プリファレンスに基づいて、結果として生じるコンポジット・イベントと一致ルールに順序を設定することです。
コンポジット・イベント間の競合解消
プリミティブ・イベントの追加によって生じるコンポジット・イベントには、対応するプリミティブ・イベントの属性に基づいて順序を設定できます。たとえば、トラベル・サービスのアプリケーションでは、AddFlight
とAddRentalCar
というプリミティブ・イベントで構成される一連のコンポジット・イベントの競合は、プリミティブ・イベントの作成時間に基づいて解消するように指定できます。その場合、このコンポジット・イベント構造の競合解決基準は、[Flt.rlm$CrtTime
, Car.rlm$CrtTime
]で表されます。これは、作成時間が最も早いイベントが他のイベントよりも先に使用されることを意味します。これは、SQL問合せのORDER BY
句と同じ表記法です。オプションで、属性とともにDESC
キーワードを使用して、イベントを降順にソートできます(構文の詳細は第3.2項を参照)。ルール・クラスがイベントを排他使用するように構成されている場合は、ソートされたこのリストの最上位イベントのみがルールの実行対象に選択されます。
単純イベントとコンポジット・イベントに対する一致ルール間の競合解消
コンポジット・イベントまたは単純イベントは、ルール・クラス内の1つ以上のルールと一致する可能性があります。複数のルールに一致する場合、デフォルトでは、それらのアクションが不確定な順序で実行されます。ルール・アクションの実行順序が重要な場合は、ルールに関連付けられているルール識別子とアクション・プリファレンスを使用して一致ルールをソートできます。たとえば、トラベル・サービスのアプリケーションでは、競合解消基準[rlm$rule.PromoType
, rlm$rule.OfferedBy
, rlm$rule.rlm$ruleid
]を使用して、一致ルール間の競合を解消できます。この場合、一致ルールのソートは、最初にアクション・プリファレンスPromoType
、次にアクション・プリファレンスOfferedBy
、次にルール識別子rlm$ruleid
別に、昇順にソートされます。この例のように、rlm$rule
は、ルール固有の属性を参照するために使用されます。競合解決基準の指定に使用する表記法およびセマンティクスは、SQL問合せのORDER BY
句と同じです。オプションで、属性とともにDESC
キーワードを使用して、ルールを降順にソートできます(構文の詳細は第3.2項を参照)。ルール・クラスがイベントを排他使用するように構成されている場合は、ソートされたリストの最上位ルールのみが実行対象に選択されます。
一連のコンポジット・イベントが一連のルールと一致する場合は、コンポジット・イベントの競合解消基準を一致ルールの競合解消基準と結合することで、ルールを実行する正確な順序を指定できます。競合解消基準を指定する構文は、ORDERINGプロパティを使用して記述されます。
ルール・クラスのORDERING
プロパティは、一連のコンポジット・イベントまたは単純イベントと一致する一連のルールの実行順序を決定します。コンポジット・イベント・タイプまたはいくつかのプリミティブ・イベント・タイプの使用率ポリシーがEXCLUSIVE
に設定されている場合は、順序付けプロパティにより、実行されるルールのサブセットも決まります。(ルールの実行に必要なEXCLUSIVE(排他)イベントは、最初のルールの実行後に削除されるため、残りの一致ルールは無視されます。)順序付けプロパティは、単純イベントに対して定義されたルールとコンポジット・イベントに対して定義されたルールの両方に適用できます。
コンポジット・イベント構造に対して作成されたルール・クラスの場合は、プリミティブ・イベントをシステムに追加することで、複数のルールと一致する可能性のある複数のコンポジット・イベントを形成できます。したがって、結果的に生じるイベントと一致ルールの順序は、イベントの属性、ルールに関連付けられているアクション・プリファレンス、およびルール識別子を使用して指定できます。トラベル・サービスのルール・クラスの例では、イベントと一致ルールの順序を次のように指定できます。
<composite ordering="Flt.rlm$CrtTime, Car.rlm$CrtTime, rlm$rule.PromoType, rlm$rule.OfferedBy, rlm$rule.rlm$ruleid"/>
この昇順の列で、属性がランク付けされる順序付け仕様rlm$rule
は、ルール・クラスに関連付けられている属性(アクション・プリファレンスPromoType
とOfferedBy
およびルール識別子rlm$ruleid
)を参照するために使用され、コンポジット・イベント構造のプリミティブ・イベントに対して宣言される変数(AddFlight
にはFlt
、AddRentalCar
にはCar
)は、プリミティブ・イベントの属性値にアクセスするために使用されます。
順序付けプロパティは、使用率や継続時間などの他のポリシーと結合できます。ルール・クラス・プロパティ内の順序付け仕様に有効なその他の形式は、次のとおりです。
<composite consumption="exclusive" ordering="Flt.rlm$CrtTime, rlm$rule.PromoType, rlm$rule.rlm$ruleid DESC"/> <simple ordering="rlm$rule.PromoType, rlm$rule.OfferedBy, rlm$rule.rlm$ruleid/>
単純イベント構造に対して作成されたルール・クラスの場合、発生するイベントはいずれかの時点に1回のみであるため、順序付けは一致ルールにのみ基づきます。したがって、順序指定句に使用できるのは、ルールに関連付けられているルール識別子とアクション・プリファレンスのみです。
アプリケーションでは、ルールの起動をトリガーしないイベントを生成することが一般的であり、したがって、これらのイベントが使用されることはありません。プリミティブ・イベントの継続時間ポリシーは、イベントの最大存続期間を決定します。ルールの増分評価のためにプリミティブ・イベントがルール・マネージャに追加されると、イベントおよび評価結果がデータベースに格納されます。これらのイベントは、その後、一致する他のプリミティブ・イベントと結合され、最終的に1つ以上のルール条件を満たすコンポジット・イベントを形成します。ただし、コンポジット・イベントを形成する一致イベントがない場合もあります。たとえば、第2.6項のトラベル・サービスのルールでは、あるルールでAddFlight
イベントが検出される可能性はありますが、対応するAddRentalCar
イベントは発生しない(または、AddRentalCar
イベントは高級車に対しては発生しない)可能性があります。したがって、プリミティブ・イベントの継続時間(または存続期間)は、一定時間経過した後に完了していない(コンポジット)イベントおよび増分ルール評価の結果が削除されるように設定する必要があります。
プリミティブ・イベントの継続時間は、ルール・アプリケーションに基づいており、次の4種類のいずれかに分類できます。
TRANSACTION(トランザクション): この継続時間ポリシーを設定すると、あるデータベース・トランザクションの中でシステムに追加されたプリミティブ・イベントは、トランザクション終了(COMMIT
またはROLLBACK
)まで存続します。したがって、コンポジット・イベントのルールがTRUEに評価されるのは、必要なすべてのプリミティブ・イベントがデータベース・トランザクション内で検出された場合のみです。
SESSION(セッション): この継続時間ポリシーを設定すると、あるデータベース・セッションの中でシステムに追加されたプリミティブ・イベントは、セッション終了(CONNECT
またはDISCONNECT
)まで存続します。したがって、コンポジット・イベントのルールがTRUEに評価されるのは、必要なすべてのプリミティブ・イベントがデータベース・セッション内で検出された場合のみです。
CALL(コール): 一部のルール・アプリケーションでは、イベントは、そのイベントが追加されるインスタンスでのみルールと一致する可能性があるとみなされるため、プリミティブ・イベントのサブセットは実際に一時的なものです。このようなイベントは、イベント履歴には提供されず、その後のルール照合には考慮されません。したがって、これらのイベントは、ルールを処理するコール(PROCESS_RULES
またはADD_EVENT
)の継続時間にのみ有効と考えられています。コンポジット・イベント内のプリミティブ・イベントのサブセットは、CALL
継続時間に対して構成できます。CALL
継続時間イベントがルールの実行に影響を与えるのは、そのイベントのルール条件が、システム内の他のイベントとの組合せにおいて、コール時点でTRUEに評価される場合のみです。これらのイベントは、コール時にルールが実行されたかどうかに関係なく、コール後のルール照合には考慮されません。
経過時間: システムに追加されるプリミティブ・イベントの継続時間は、ルール・クラスに関連付けられているイベント・タイムアウトによって決まります。イベント・タイムアウトは、経過時間(10時間、3日など)として指定され、イベント削除の正確な時間を判断するために作成時間(rlm$CrtTime
属性で決まる)に加算されます。
継続時間ポリシーは、システム内のプリミティブ・イベントの存続期間に影響します。単純イベントに対して作成されたルール・クラスの場合、イベントはシステムには格納されません(各イベントに対してルールが最終的に評価されるため)。したがって、継続時間ポリシーは、コンポジット・イベント構造に対して作成されたルール・クラスにのみ適用できます。各(データベース)トランザクション終了時にすべてのプリミティブ・イベントをリセットするように構成されたルール・クラスでは、次のXMLプロパティ文書を使用します。
<composite duration="transaction"/>
継続時間を経過時間として指定する場合は、継続時間属性の値を次のように{[int] minutes | hours | days}形式で指定できます。
<composite duration="20 minutes"/> <composite duration="2 hours"/> <composite duration="10 days"/>
これらの仕様は、コンポジット・イベントを構成するプリミティブ・イベントのすべてに適用されます。一部のプリミティブ・イベント・タイプに別の継続時間仕様が必要な場合は、次のように<composite>
要素の子要素として指定できます。
<composite duration="10 days"> <object type="AddFlight" duration="3 days"/> <object type="AddRentalCar" duration="call"/> </composite>
この場合は、<composite>
要素のduration
属性の10 days(10日間)という値が、コンポジット・イベントのすべてのプリミティブ・イベントのデフォルト値として使用されます。プリミティブ・イベント・タイプのこのデフォルト値は、たとえば、AddRentalCar
イベント・タイプに指定される継続時間プロパティcall
が示しているように、<composite>
要素の子要素としてプリミティブ・イベントを指定し、この要素にduration
属性を指定することで上書きされます。したがって、これらのAddRentalCar
イベントは、PROCESS_RULES
またはADD_EVENT
コール時にルールに一致しなかった場合は破棄されることになります。
継続時間ポリシーでは、TRANSACTION
またはSESSION
の値を継続時間ポリシーに指定できるのは、コンポジット・イベント・レベルのみという制限があります。指定した場合、それらの値をプリミティブ・イベント・レベルで上書きすることはできません。
コンポジット・イベントに対するルール・クラスの場合、すべてのルール条件において最も共通性の高い等価性結合述語を識別し、EQUAL
ルール・クラス・プロパティを使用してこれらを指定することは、パフォーマンスのために重要です。単一のルール・クラス内のすべてのルールでは、1つ以上の共通の(等価性)結合述語を使用して、コンポジット・イベントを形成するプリミティブ・イベントを関連付けます。これらの結合述語は、対応するプリミティブ・イベント・タイプの属性を使用して定義されます。たとえば、トラベル・サービスのアプリケーションで、コンポジット・イベントにあるAddFlight
イベントとAddRentalCar
イベントは、これらのプリミティブ・イベントの顧客識別子を介して関連付けられます(Flt.CustId = Car.CustId
)。EQUAL
プロパティを使用して、ルール条件で使用される限られた数の等価性結合述語を最適化するようにルール・クラスを構成できます。
注意: パフォーマンスを向上させるために、ルール・クラス・レベルでEQUAL プロパティを使用することをお薦めします。 |
単一のルール・クラスに使用されるEQUAL
プロパティには、そのルール内の同質の結合条件に依存する2つのタイプがあります。すべてのルール条件に対して同一の等価性結合述語を使用する同質のルール・セットがあるルール・クラスの場合、ルール・クラスのequal指定は一意に識別され、equal指定は1つのみです。一方、別のルールのサブセットにより異なる結合述語が使用される場合、そのルール・クラスは限られた数の代替equal指定で構成されます。各equal指定は、関連するプリミティブ・イベントからの単一の属性に基づいているか、またはこの項で説明する補助の各プリミティブ・イベント(連結キー)からの複数の属性に基づきます。
ルール・クラスに対する単一equal指定により、ルール・クラス内のすべてのルールで使用される等価性結合述語が識別されます。たとえば、トラベル・サービスのアプリケーション内のすべてのルールによって顧客識別子(Flt.CustId = Car.CustId)
に基づいたプリミティブ・イベントが関連付けられる場合、この結合述語はルール・クラスのEQUAL
プロパティの単一equal指定として構成されます。
この場合、EQUAL
プロパティがカンマ区切りの属性のリストとして指定され、各プリミティブ・イベント構造から1つの結合述語がルール・クラスに対して構成され、ルール・クラスのルールすべての結合述語として使用されます。このリストは、コンポジット・イベントの形成に等価であることが必要なプリミティブ・イベント属性を識別します。次に例を示します。
<composite equal="Flt.CustId, Car.CustId"/>
コンポジット・イベントに3つ以上のプリミティブ・イベントがある場合、対応するルール条件により、多くの等価性結合述語のうち2つの論理積が選択されます。たとえば、reading1
、reading2
およびreading3
がRFID readingを表す3つのプリミティブ・イベントである場合、これら3つのイベントに関連するルール内の結合条件はreading1.ReaderId = reading2.ReaderId
およびreading2.ReaderId = reading3.readingId
です(3つすべてのreadingが同一のリーダーに起こることを確認します)。対応するequal指定は、各プリミティブ・イベント(reading1.readerId
、reading2.readerId
、reading3.readerId
)の属性をカンマ区切りのリストで表します。
単一のequal指定の場合、各ルール条件で同一の等価性結合述語を使用することが保証されているので、ルール・クラス・プロパティのequal指定では、同一の結合述語を各ルール条件内に準備する必要はありません。したがって、ルール・クラス内のルールでは、次の例で示すように同一の属性セットに関係する等価性結合述語を省略できます。
次のルール条件により、おそらく非等価性である別の結合述語を使用して論理積に等価性結合述語が明示的に指定されます。この指定では、結合述語に対してSQL WHERE
句構文が使用されます。
<condition>
<and join="Flt.CustId = Car.CustId
and Car.rlm$CrtTime > Flt.rlm$CrtTime ">
<object name="Flt"> Airline='Abcair' and ToCity='Orlando' </object>
<object> CarType = 'Luxury' </object>
</and>
</condition>
次のルール条件では、前述の例で使用した等価性結合述語のかわりにEQUAL句を使用する方法を示します。ルール条件のEQUAL句の指定は、特に、ルール条件に否定の構成メンバーがある場合(第5.3項を参照)、またはANY nの構成メンバーがある場合(第5.5項を参照)、等価性結合述語の短い表現として機能します。
<condition> <and equal="Flt.CustId, Car.CustId" join="Car.rlm$CrtTime > Flt.rlm$CrtTime"> <object name="Flt"> Airline='Abcair' and ToCity='Orlando' </object> <object> CarType = 'Luxury' </object> </and> </condition>
ルール・クラスのEQUAL
プロパティがequal="Flt.CustId, Car.CustId"
として指定される場合、前述の2つの例で示したように、対応する結合述語またはEQUAL句をルール条件で使用する必要はありません。この場合、ルール・クラスに関連付けられた単一equal指定はルール・クラス内のすべてのルールに対して実行されます。したがって、ルール・クラスが前述のEQUAL
プロパティで作成された場合、次のルール条件は前述の2つの例と同等になります。
<condition> <and join="Car.rlm$CrtTime > Flt.rlm$CrtTime"> <object name="Flt"> Airline='Abcair' and ToCity='Orlando' </object> <object name="Car"> CarType = 'Luxury' </object> </and> </condition>
連結キーを使用するequal指定
プリミティブ・イベント間の等価性結合述語が、各プリミティブ・イベントからの1つ以上の属性に関連する場合が頻繁にあります。たとえば、トラベル・サービスのアプリケーションでは、AddFlight
イベントおよびAddRentalCar
イベントは、顧客識別子の等価性に加えて、旅程(各イベントからのDepart
日およびCheckOut
日の等価性述語)に基づいて相互に関連する場合があります。このような結合述語を使用するサンプル・ルールは次のとおりです。
<and join="Flt.CustId = Car.CustId and Flt.Depart = Car.CheckOut"
>
<object name="Flt"> Airline = 'Abcair' and ToCity = 'Orlando' </object>
<object name="Car"> CarType = 'Luxury' </object>
</and>
各プリミティブ・イベントからの複数の属性に関連する等価性述語がルール・クラス内のすべてのルールに共通している場合、ルール・クラスは最適なパフォーマンスのための連結キーを含むEQUAL
プロパティ仕様で構成されます。
<composite equal="(Flt.CustId, Car.CustId), (Flt.Depart, Car.CheckOut)"/>
注意: 3つの連結キーの最大値はルール・クラスのEQUALプロパティで指定できます。 |
前述の仕様では、[Flt.CustId
,Flt.Depart
]属性の組合せが各Flt
イベントに対する連結キーとして機能しており、Car
イベントからの連結キーと一致させ、ルール・クラス内のすべてのルールをTRUEにする必要があります。前述のequal指定はルール・クラスのすべてのルールに対して実行されるため、各ルールの類似するequal指定は省略される場合があります。
ルール・クラスのEQUAL
プロパティ仕様のもう1つの形式は、そのルール内で最も共通性の高い等価性結合述語のリストを識別します。そのために、単一の各equal指定はカッコを使用してグループ化され、代替のequal指定は縦線(|)を使用して区別されます。たとえば、同じRFIDRead
タイプの2つのプリミティブ・イベントを使用して作成されたルール・クラスの場合、ルール・クラス内の一方のルールのサブセットでは、そのItemId
属性に対してプリミティブ・イベントを結合できます(reading1.ItemId = reading2.ItemId
)。同じルール・クラス内のルールのもう一方のサブセットでは、そのReaderId
属性に対してプリミティブ・イベントを関連付けることができます(reading1.ReaderId = reading2.ReaderId
)。次のEQUAL
プロパティを使用して、これら両方のタイプのルールを効果的に処理するようにルール・クラスを最適化できます。
<composite equal="(reading1.ItemId, reading2.ItemId) | (reading1.ReaderId, reading2.ReaderId)"/>
注意: 単一のルール・クラスのEQUAL プロパティに最大で5個の代替のequal指定を定義できます。 |
代替のequal指定は、ルール・クラス内で最も共通性の高い結合述語についてルール評価を最適化する方法を提供しますが、そのルールの等価性結合述語がルール・クラスにより自動的に実行されることはありません。最適なパフォーマンスを維持するために、ルール・クラスの各ルール条件では、各EQUAL句に対して1つの代替のequal指定を指定する必要があります。たとえば、次のルールのEQUAL句は、ルール・クラス・レベルで代替のequal指定の1つと一致します。したがって、このルールは最適化されています。
<condition> <and equal="reading1.ItemId, reading2.ItemId"/> <object name="reading1"/> <object name="reading2"/> </and> </condition>
したがって、ルール・クラス内の個別のルールに対するEQUAL句は、等価性結合述語の短い表現として単純に機能するのみでなく、代替のEQUAL
プロパティ仕様の1つにマップする際にも役立ちます。
代替のequal指定には、連結キーに関連する1つ以上の仕様が含まれます。たとえば、トラベル・サービスのアプリケーションで、顧客識別子に基づいてAddFlight
イベントおよびAddRentalCar
イベントのみを関連付けるいくつかのルールを使用していて、また旅程内の日付と同様に識別子に基づいたその他のルールも使用する場合、ルール・クラスは次の最適なパフォーマンスのための等価プロパティで構成されます。
<composite equal="(Flt.CustId, Car.CustId) | (Flt.CustId, Car.CustId), (Flt.Depart, Car.CheckOut)"/>
ルール・クラス・レベルでのこの仕様では、ルール・クラス内の個別のルールはこれら2つの代替のEQUAL
プロパティ仕様の両方を使用します。
<condition> <and equal="(Flt.CustId, Car.CustId), (Flt.Depart, Car.CheckOut)"> <object name="Flt"> Airline='Abcair' and ToCity='Orlando' </object> <object> CarType = 'Luxury' </object> </and> </condition>
単一のルールに指定されたEQUAL句と代替のequal指定の1つが一致しても、属性の順序には関連がないことに注意してください。
<simple>
または<composite>
要素のSTORAGE
属性は、ルール・クラス表およびルール・クラスに対して作成された内部オブジェクトの記憶域プロパティを指定するために使用されます。デフォルトでは、ルール・クラス内のルール管理に使用されるデータベース・オブジェクトは、記憶域プロパティのユーザー・デフォルトを使用して作成されます(例: 表領域仕様)。この属性の値には、一般的なSQL CREATE TABLE
文に指定できる有効な記憶域プロパティを割り当てることができます。次のXMLプロパティ文書を(dbms_rlmgr.create_rule_class
プロシージャへの引数として)使用して、表領域TBS_1
にある単純イベントに対するルール・クラスを作成し、EXCLUSIVE(排他)使用率ポリシーを使用できます。
<simple storage="tablespace TBS_1" consumption="exclusive"/>
次の例は、ルール・クラス・プロパティに記憶域属性を指定しています。
<composite storage="tablespace TBS_1"/>
ほとんどの場合、ルール・マネージャのすべてのプロシージャは、ルールの追加、ルールの削除およびルールの処理の各操作の直後にコミットします。ルール・クラスをトランザクション境界に従うように構成するには、自動コミット機能をオフに切り替えます。そのために、AUTOCOMMIT
プロパティをルール・クラス・プロパティ文書に指定できます。次に例を示します。
<simple autocommit="NO"/>
AUTOCOMMIT
プロパティは、コンポジット・イベントのみでなく、単純イベントに対して作成されたルール・クラスにも指定できます。AUTOCOMMIT
プロパティに有効なその他の形式は、次のとおりです。
<composite autocommit="NO" consumption="shared"/> <composite autocommit="YES"/>
AUTOCOMMIT
プロパティがNO
に設定されている場合は、ROLLBACK
文を発行することで、トランザクションで実行された一連のルール・マネージャ操作(ルールの追加、ルールの削除、ルールの処理)をロールバックできます。このルールの例外は、アクション・コールバック・プロシージャ(エンド・ユーザーによる実施)で、元に戻せない操作(メールの送信、データ定義言語(DDL)操作の実行、コミット、ロールバックなど)を実行する場合です。アクション・コールバック操作のDDL操作は、そのトランザクションで実行されたすべての操作を自動的にコミットします。この状況を回避するには、DDL操作を自律型トランザクションで実行する必要があります。
ルール・クラスのAUTOCOMMIT
プロパティをオフに切り替えることで、ルール・クラスに対する同時操作を制限できます。特に、ルール・クラスがコンポジット・イベントに対して作成され、そのイベントがEXCLUSIVE(排他)使用率ポリシーに対して構成された場合に指定します。(トランザクションでは、使用されたイベントはトランザクションがコミットされるまでロックされ、他のセッションはこれらのイベントのリリースを待機できます。)
AUTOCOMMIT
プロパティのデフォルト値は、他のイベント管理ポリシーに依存しています(表3-1を参照)。このポリシーのデフォルト値は、単純(非コンポジット)ルールに対して構成されたルール・クラス、およびSESSION
またはTRANSACTION
の継続時間ポリシーを使用して構成されたコンポジット・ルール・クラスではNO
です。(これらの構成では、複数のセッションにわたってイベントを共有することに起因する問題は発生しません。)その他すべての構成では、AUTOCOMMIT
プロパティにはYES
のデフォルト値が使用されます。継続時間ポリシーがTRANSACTION
に設定されている場合は、AUTOCOMMIT
プロパティをYES
に設定できないことに注意してください。また、EXCLUSIVE
またはRULE
の使用率ポリシーに対して1つ以上のプリミティブ・イベント・タイプが構成されている場合は、AUTOCOMMIT
プロパティをNO
に設定できません。
1つ以上の表の別名の構成メンバーを使用してイベント構造が定義され、対応するルール・クラスがDMLイベント(第3.7項を参照)に対して構成されている場合は、AUTOCOMMIT
プロパティを必ずNO
に設定します。このように設定すると、EXCLUSIVE
またはRULE
の使用率ポリシーを併用しているときに、デッドロックが発生する可能性があることに注意してください。
AUTOCOMMIT
プロパティがNO
に設定されているルール・クラスには、否定と期限に関係するルールは指定できません(第5.3項を参照)。
イベント構造が1つ以上の表別名属性を使用して作成されている場合(第4.1項を参照)は、対応する表に対するSQL INSERT
およびSQL*Loader操作がルールの評価対象のイベントとみなされるように、対応するルール・クラスを構成できます。このルール・クラスの動作は、ルール・クラスのDMLEVENTS
またはCNFEVENTS
プロパティを使用して有効化できます。
<simple dmlevents="I"/> <simple cnfevents="I"/>
この両方のプロパティは、単純イベントおよびコンポジット・イベントに対して構成されたルール・クラスに指定できます。基礎となる表にあるUPDATE
操作およびDELETE
操作に対するイベントはコンポジット・イベントに対して構成されたルール・クラスに対してのみ適用できます。
<composite dmlevents="IUD"/> <composite cnfevents="IUD"/>
表内の行が削除される場合、この行に一致するルールの状態情報には削除のマーク付けがされます。同様に、行が更新されると、既存の状態情報には削除のマーク付けがされ、更新された行に対して新規の状態情報が計算されます。削除された行(または更新された行の古いイメージ)は、過去のルールの状態に影響を与えません。つまり削除操作によって、イベントの取消のために既存のルールの状態が自動的にTRUEになることはありません。この例は、削除前にイベントがルールの否定部分に一致した否定の構成メンバーを含むルール条件に関連します。
DMLEVENTS仕様では、DML操作から生成されたイベントは、同じDMLコマンドの一部としてルール・クラスのルールの処理に使用されます。ここでは、基礎となる表の行レベル・トリガーを使用します。または、CNFEVENTS仕様が使用される場合、ルールはイベントとしてネット・データの変更を使用したDMLトランザクションのコミットの後に処理されます。実際、行が表に挿入されて同じトランザクション内に更新される場合、CNFEVENTS仕様では、ルールは新しく挿入された行(コミットされたデータ付き)のために1回処理されます。一方、DMLEVENTS仕様が使用された場合は、ルールは同じ行のために2回処理され、1回目はINSERT
操作で処理され、2回目はUPDATE
操作で処理されます。CNFEVENTSの使用の詳細は、第4.9項を参照してください。
DMLEVENTS
ポリシーが指定されている場合は、ルール・クラスのAUTOCOMMIT
ポリシーをNO
にしてください。この場合、NO
のAUTOCOMMIT
ポリシーは、使用率ポリシーがEXCLUSIVE
またはRULE
に設定されている場合も許可されます(DMLEVENTS
ポリシーが使用されていない場合は、無効な組合せとみなされます)。EXCLUSIVE
またはRULE
の使用率ポリシーをDMLEVENTS
ポリシーと併用すると、アプリケーションのデッドロックが発生することがあります。
この項で説明するほとんどのルール・クラス・プロパティ(またはイベント管理ポリシー)は、ルール・クラスを定義する際にうまく組み合せることができます。ただし、これらのプロパティの組合せの一部は、表3-1に示すように無効とみなされます。たとえば、ルール・クラスのAUTOCOMMIT
プロパティをYES
に設定した場合、DURATION
ポリシーに対するTRANSACTION
の設定は無効となります。これは、イベントが追加されるとすぐにシステムから削除され、コンポジット・イベントを形成する他のイベントと組み合せることができないためです。DMLEVENTS
ポリシーは、イベント管理ポリシーの有効および無効な組合せには直接影響しません。このポリシーは、AUTOCOMMIT
ポリシーのデフォルト値のみに影響します。
表3-1 ルール・クラス・プロパティの有効および無効な組合せ
AUTOCOMMIT | CONSUMPTION | DURATION | |
---|---|---|---|
無効 |
Yes |
-- |
Transaction |
有効 |
Yes |
-- |
Session |
有効 |
Yes |
-- |
[n] Units |
有効 |
No |
Shared |
-- |
有効 |
No |
Exclusive |
Transaction脚注1 |
有効 |
No |
Exclusive |
Session脚注1 |
無効 |
No |
Exclusive |
[n] Units脚注2 |
有効 |
No |
Rule脚注3 |
Transaction脚注1 |
有効 |
No |
Rule |
Session脚注1 |
無効 |
No |
Rule |
[n] Units脚注 2 |
脚注1 SESSION
またはTRANSACTION
モードで動作しているルール・クラスでは、イベントおよび増分結果のプライベート・コピーを取得するため、データベース・セッション間での並行性の問題はありません。
脚注2 EXCLUSIVE
使用率ポリシーが指定されたルール・クラスは、一部の行をロックして「使用済」とマークしますが、それらの行は実際には使用できません。このような行は、他のデータベース・セッションによる使用が回避されるため、その結果デッドロックとなります。したがって、ロックされた行はAUTOCOMMIT="YES"プロパティでリリースすることをお薦めします。
脚注3 RULE
は、特定のイベントの使用がエンド・ユーザーによって開始されるEXCLUSIVE
使用率ポリシーの特殊な形式です。
単純イベントに対して構成されたルール・クラスの様々なイベント管理ポリシーのデフォルト値は、次のとおりです。
CONSUMPTION : Shared DURATION : Infinite Duration (NULL) AUTOCOMMIT : No
コンポジット・イベントに対して構成されたルール・クラスのイベント管理ポリシーのデフォルト値は、次のようにイベント管理ポリシーに依存することがあります。
CONSUMPTION : Shared DURATION : Infinite Duration (NULL) AUTOCOMMIT IF DMLEVENTS = IUD : NO ELSE IF DURATION = TRANSACTION / SESSION : NO ELSE : YES