嵌套觸發器創建規則
當觸發器執行啟動其他觸發器的操作時,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、嵌套調用一旦出現問題,排錯困難,而且數據容易造成不一致,后期維護不方便。