5.SQL Server DML触发器--嵌套和递归触发器

本文介绍了SQL Server中的DML触发器,包括嵌套触发器和递归触发器的概念及示例。在嵌套触发器中,详细说明了如何设置嵌套限制,并通过示例展示了如何创建和使用嵌套触发器。对于递归触发器,解释了直接递归和间接递归的区别,并提供了防止死循环的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本文摘自《锋利的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中被删除的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值