9.11 トリガーの起動順序
タイミングの異なる2つ以上のトリガーを同じ表の同じ文に定義する場合、それらのトリガーは次の順序で起動されます。
-
すべての
BEFORESTATEMENTトリガー -
すべての
BEFOREEACHROWトリガー -
すべての
AFTEREACHROWトリガー -
すべての
AFTERSTATEMENTトリガー
場合によっては、異なるタイミングを持つ個々のトリガー群を、必要な順序でアクションを明示的にコード化した単一の複合トリガーに置き換えます。複合トリガーの詳細は、「複合DMLトリガー」を参照してください。
タイミングが同じ2つ以上のトリガーを作成する際に、起動順序が重要である場合は、FOLLOWS句またはPRECEDES句(「FOLLOWS | PRECEDES」を参照)を使用してその起動順序を制御できます。
1つの表に複数の複合トリガーを作成する場合、次のことに注意してください。
-
すべての
BEFORESTATEMENTセクションはBEFORESTATEMENTのタイミングで、BEFOREEACHROWセクションはBEFOREEACHROWのタイミングで、というように実行されます。トリガーの実行順序が
FOLLOWS句で指定された場合、FOLLOWS句によって複合トリガーのセクションの実行順序が決定されます。FOLLOWSがすべてのトリガーではなく一部のトリガーに指定されている場合、トリガーの実行順序はFOLLOWS句によって関係付けられたトリガーについてのみ保証されます。 -
すべての
AFTERSTATEMENTセクションはAFTERSTATEMENTのタイミングで、AFTEREACHROWセクションはAFTEREACHROWのタイミングで、というように実行されます。トリガーの実行順序が
PRECEDES句で指定された場合、PRECEDES句によって複合トリガーのセクションの実行順序が決定されます。PRECEDESがすべてのトリガーではなく一部のトリガーに指定されている場合、トリガーの実行順序はPRECEDES句によって関係付けられたトリガーについてのみ保証されます。ノート:
PRECEDESは、reverse crosseditionトリガーにのみ適用されます。詳細は、『Oracle Database開発ガイド』を参照してください。
複合トリガーの起動は、単純なトリガーの起動でインターリーブされる可能性があります。
あるトリガーによって他のトリガーが起動される場合、それらのトリガーはカスケードしていると言われます。データベースでは、一度に最大32個のトリガーをカスケードできます。カスケードするトリガーの数を制限する場合、トリガーを起動するたびにカーソルがオープンされるため、OPEN_CURSORS初期化パラメータ(『Oracle Databaseリファレンス』を参照)を使用します。