トリガーの起動順序

タイミングの異なる2つ以上のトリガーを同じ表の同じ文に定義する場合、それらのトリガーは次の順序で起動されます。

  1. すべてのBEFORE STATEMENTトリガー

  2. すべてのBEFORE EACH ROWトリガー

  3. すべてのAFTER EACH ROWトリガー

  4. すべてのAFTER STATEMENTトリガー

場合によっては、異なるタイミングを持つ個々のトリガー群を、必要な順序でアクションを明示的にコード化した単一の複合トリガーに置き換えます。複合トリガーの詳細は、「複合DMLトリガー」を参照してください。

タイミングが同じ2つ以上のトリガーを作成する際に、起動順序が重要である場合は、FOLLOWS句またはPRECEDES句(「FOLLOWS | PRECEDES」を参照)を使用してその起動順序を制御できます。

1つの表に複数の複合トリガーを作成する場合、次のことに注意してください。

  • すべてのBEFORE STATEMENTセクションはBEFORE STATEMENTのタイミングで、BEFORE EACH ROWセクションはBEFORE EACH ROWのタイミングで、というように実行されます。

    トリガーの実行順序がFOLLOWS句で指定された場合、FOLLOWS句によって複合トリガーのセクションの実行順序が決定されます。FOLLOWSがすべてのトリガーではなく一部のトリガーに指定されている場合、トリガーの実行順序はFOLLOWS句によって関係付けられたトリガーについてのみ保証されます。

  • すべてのAFTER STATEMENTセクションはAFTER STATEMENTのタイミングで、AFTER EACH ROWセクションはAFTER EACH ROWのタイミングで、というように実行されます。

    トリガーの実行順序がPRECEDES句で指定された場合、PRECEDES句によって複合トリガーのセクションの実行順序が決定されます。PRECEDESがすべてのトリガーではなく一部のトリガーに指定されている場合、トリガーの実行順序はPRECEDES句によって関係付けられたトリガーについてのみ保証されます。

    ノート:

    PRECEDESは、reverse crosseditionトリガーにのみ適用されます。詳細は、『Oracle Database開発ガイド』を参照してください。

複合トリガーの起動は、単純なトリガーの起動でインターリーブされる可能性があります。

あるトリガーによって他のトリガーが起動される場合、それらのトリガーはカスケードしていると言われます。データベースでは、一度に最大32個のトリガーをカスケードできます。カスケードするトリガーの数を制限する場合、トリガーを起動するたびにカーソルがオープンされるため、OPEN_CURSORS初期化パラメータ(『Oracle Databaseリファレンス』を参照)を使用します。