触发器级联 (trigger cascading)

当触发器执行 SQL 操作时,可能会修改主表或其他带有触发器的表,因此 Db2 也会激活这些触发器。 这种情况被称为触发级联。

由另一个触发器激活的触发器可以与原始触发器处于同一级别,也可以处于不同级别。 如果触发器B在触发器A激活后激活,并在触发器A激活完成前完成,则触发器A和B会在不同级别被激活。 如果触发器B在触发器A激活后激活,并在触发器A完成后完成,则触发器处于同一级别。

例如,在这些情况下,触发器A和触发器B在相同级别被激活:

  • 表X有两个定义好的触发器,A和B。 A是前触发器,B是后触发器。 表X的更新导致触发器A和触发器B同时激活。
  • 触发器A更新表X,表X与表Y存在参照约束,而表Y上定义了触发器B。 参照约束导致表Y被更新,从而激活触发器B。

在这种情况下,触发器A和触发器B在不同的水平上被激活:

  • 更改开始触发器A在表X中定义,触发器B在表Y中定义。 触发器B是更新触发器。 表X的更新激活了触发器A,该触发器在触发器主体中包含一条关于表Y的UPDATE语句。 此UPDATE语句激活触发器B。更改结束
  • 触发器A调用一个存储过程。 存储过程包含一个针对表X的INSERT语句,该语句定义了插入触发器B。 当表X上的INSERT语句执行时,触发器B被激活。

当触发器在不同级别被激活时,这被称为触发器级联 触发级联仅适用于后置触发器,因为 Db2 不支持前置触发器的级联。

为了防止触发器级联无限扩展, Db2 仅支持16级触发器、存储过程和用户定义函数的级联。 若第17级触发器、用户自定义函数或存储过程被激活, Db2 则返回SQLCODE -724并撤销级联中16级内的所有SQL变更。 然而,与触发器执行期间发生的任何其他SQL错误一样,如果发生任何不受 Db2 控制的行为,则该行为不会被撤销。

您可以编写一个监视程序,发出IFI READS请求,以收集 Db2 跟踪信息,了解程序中触发器、用户定义函数和存储过程的级联级别。