级联触发器

数据库服务器允许除 Select 触发器外的其它触发器级联,也就是说,一个触发器的触发器操作可以激活另一个触发器。(有关级联 Select 触发器的限制的更多信息,请参阅 Select 触发器被激活时的情况。)

级联序列中触发器的最大数目是 61:即初始触发器加上最多 60 个级联触发器。当序列中的级联触发器数目超过最大值时,数据库服务器返回错误号码 -748,带有一些信息:
Exceeded limit on maximum number of cascaded triggers.
下一个示例说明在 stores_demo 数据库中的 manufactstockitems 表上实施引用完整性的级联触发器序列。当从 manufact 表删除制造商是,第一个触发器 del_manustock 表中删除该制造商的所有条目。stock 表中的每个 DELETE 激活第二个触发器 del_items,该触发器从 items 表删除该制造商的所有 items。最终,items 表中的每个 DELETE 触发 SPL 例程 log_order,同时在不能再被填充的 orders 表中创建所有订单的记录。
CREATE TRIGGER del_manu
        DELETE ON manufact REFERENCING OLD AS pre_del
        FOR EACH ROW(DELETE FROM stock WHERE manu_code = pre_del.manu_code);
        CREATE TRIGGER del_stock
        DELETE ON stock REFERENCING OLD AS pre_del
        FOR EACH ROW(DELETE FROM items WHERE manu_code = pre_del.manu_code);
        CREATE TRIGGER del_items
        DELETE ON items REFERENCING OLD AS pre_del
        FOR EACH ROW(EXECUTE PROCEDURE log_order(pre_del.order_num));

当您不使用日志记录时,manufactstock 表上的引用完整性约束都阻止该示例中的触发器执行。但是,当您使用日志记录时,触发器成功执行,因为约束检查被延迟,直至所有的触发操作(包括级联触发器的操作)都完成。关于执行触发器时如何处理约束的信息,请参阅约束检查

除了不修改触发 UPDATE 语句别更新的任何列的 UPDATE 语句或 INSERT 语句外,数据库服务器通过不允许您修改任何级联触发器操作中的触发表俩防止触发器循环。INSERT 触发器可以在同一个表上定义 UPDATE 触发操作。