トリガー・カスケード

トリガーが SQL 操作を実行する場合、トリガーを使用してサブジェクト表または他の表を変更することがあります。そのため、Db2 はそれらのトリガーもアクティブにします。 この状態は、トリガー・カスケードと呼ばれます。

他のトリガーの結果としてアクティブになるトリガーは、 当初のトリガーと同じレベル、または異なるレベルでアクティブになれます。 2 つのトリガー A と B は、 トリガー A がアクティブになった後でトリガー B がアクティブになり、トリガー A が 完了する前にトリガー B が完了する場合には、異なるレベルでアクティブになります。 トリガー A がアクティブになった後でトリガー B がアクティブになり、 トリガー A が完了した後でトリガー B が完了する場合、これらのトリガーは同じレベルです。

例えば次の場合、トリガー A とトリガー B は同じレベルでアクティブになります。

  • 表 X には、 AとB に定義される 2つのトリガーがあります。 A は前のトリガーで、 B は後のトリガーです。 表 X の更新により、トリガー A とトリガー B の両方がアクティブになる。
  • トリガー A が表 X を更新し、表 X は表 Y に対して参照制約を持ち、 表 Y にはトリガー B が定義されている。 参照制約により、表 Y が更新されるので、トリガー B がアクティブになる。

次の場合、トリガー A とトリガー B は異なるレベルでアクティブになります。

  • トリガーAは、表Xで定義され、トリガーBは表 Yで定義されます。 トリガーBは更新トリガーです。 表 X に対する更新により、トリガー本体に表 Y に対する UPDATE ステートメントを含むトリガー A が活動化されます。 この UPDATE ステートメントはトリガー B をアクティブにする。
  • トリガー A がストアード・プロシージャーを呼び出す。 ストアード・プロシージャーには表 X への INSERT ステートメントが含まれ、 表 X には挿入トリガー B が定義されている。 表 X への INSERT ステートメントが実行されると、トリガー B がアクティブになる。

複数のトリガーが異なるレベルでアクティブになる場合、 これをトリガーのカスケード と呼びます。 トリガー・カスケードは、 Db2 がトリガーのカスケードをサポートしていないため、トリガーの後にのみ発生する可能性があります。

Db2無限のトリガーカスケードの可能性を防ぐために、トリガー、ストアドプロシージャ、およびユーザー定義関数の16レベルのカスケードのみをサポートします。 第 17 レベルでトリガー、ユーザー定義関数、またはストアード・プロシージャーがアクティブ化されている場合、 Db2 は SQLCODE -724 を戻し、16 レベルのカスケードのすべての SQL 変更をバックアウトします。 ただし、トリガーの実行中に発生する他のSQLエラーと同様に、Db2の制御外のアクションが発生した場合、そのアクションはバックアウトされません。

IFI READS要求を発行して、プログラム内のトリガー、ユーザー定義関数、およびストアード・プロシージャーのカスケードのレベルに関するDb2トレース情報を収集するモニター・プログラムを作成できます。