SQLServer之创建嵌套触发器
嵌套触发器创建规则
当触发器执行启动其他触发器的操作时,DML 和 DDL 触发器都是嵌套触发器。 这些操作都可以启动其他触发器等。 DML 触发器和 DDL 触发器最多可以嵌套 32 层。 可以通过 nested triggers 服务器配置选项来控制是否可以嵌套 AFTER 触发器。 但不管此设置是什么,都可以嵌套 INSTEAD OF 触发器(只有 DML 触发器可以为 INSTEAD OF 触发器)。
Transact-SQL 触发器中对托管代码的任何引用均计为 32 层嵌套限制中的一层。 从托管代码内部调用的方法不根据此限制进行计数。
如果允许使用嵌套触发器,且链中的一个触发器启动了一个无限循环,则将超出嵌套层限制,且触发器将终止。
嵌套触发器创建
示例:本示例演示插入数据时插入触发器触发另一个插入触发器动态的创建一个表进行备份。
--声明数据库引用
use testss;
go
--判断是否存在嵌套触发器,如果存在则删除
if exists(select * from sys.triggers where name='nestingtri')
drop trigger nestingtri;
go
--创建触发器
create
trigger
nestingtri
on
test1
for
insert
as
begin
--如果存在临时表,则先删除
if exists(select * from sys.tables where name='test4')
begin
drop table test4;
end
--如果有插入的数据,则执行创建表并插入数据
if (select count(1) from inserted) = 1
begin
print('插入触发器触发了嵌套触发器!');
select * into test4 from test1;
end
end
示例结果:
嵌套触发器优缺点
优点:
1、可以实现更加复杂的业务规则。
2、触发器可以调用一个或多个存储过程。
3、触发器最多可以嵌套32层。
缺点:
1、如果不知道存在嵌套触发器,对数据的定义或者修改会造成级联操作。
2、嵌套调用一旦出现问题,排错困难,而且数据容易造成不一致,后期维护不方便。