本文摘自《锋利的SQL》:http://item.jd.com/10380652.html
1.嵌套触发器
无论是DML触发器还是DDL触发器,如果出现了一个触发器执行启动另一个触发器的操作,都属于嵌套触发器。DML触发器和DDL触发器最多可以嵌套32层,SQL触发器中对托管代码的任何引用均计为32层嵌套限制中的一层,从托管代码内部调用的方法不根据此限制进行计数。
可以通过nestedtriggers服务器配置选项来控制是否可以嵌套AFTER触发器。INSTEAD OF触发器嵌套不受此选项影响。参考下面的语句:
sp_configure 'nested triggers',1; -- 设置nested triggers选项为1,允许AFTER触发器嵌套
GO
RECONFIGURE; -- 使用新环境值
GO
EXEC sp_configure 'nested triggers'; -- 查看nested triggers选项设置
GO
如果嵌套触发器中的一个触发器启动了一个无限循环,则将超出嵌套层限制,触发器将被终止执行。
在下面的示例中,当从PriTable表中删除订单信息时,PriDelTrigger触发器将从DetailTable表中删除该笔订单的产品信息,在删除这些信息的同时,DetailDelTrigger触发器将保存被删除行到DetailTableBak表中。这种由一个触发器启动另一个触发器的操作,就属于嵌套触发器。
USE AdventureWorks;
Go
-- 创建主表,存放销售订单编号和金额
CREATE TABLE PriTable
(OrderID int IDENTITY(1,1), OrderTotal money);
-- 创建明细表,存放每笔订单中的产品信息
CREATE TABLE DetailTable
(OrderID int, ProductID int, ProductCount int NOTNULL, Price money);
-- 创建备份表,存储DetailTable中被删除的数据