Dun*_*yen 2 trigger sql-server insert
我特意创建了这个例子来代表我的问题。
我创建了这样的表:
CREATE TABLE a
(
id INT
)
Run Code Online (Sandbox Code Playgroud)
然后我像这样创建了 2 个AFTER TRIGGER:
CREATE TRIGGER insert_a
ON a AFTER INSERT
AS
BEGIN
INSERT INTO a VALUES (1)
END
GO
CREATE TRIGGER insert_a2
ON a AFTER INSERT
AS
BEGIN
INSERT INTO a VALUES(2)
END
GO
Run Code Online (Sandbox Code Playgroud)
之后我插入到表中:
INSERT INTO a VALUES (0)
Run Code Online (Sandbox Code Playgroud)
我得到了结果:
消息 217,级别 16,状态 1,过程 insert_a2,第 5 行 [批处理起始行 0]。
超出最大存储过程、函数、触发器或视图嵌套级别(限制为 32)。
我认为这里存在周期性情况。触发器内部的插入,一次又一次地触发触发器。那会发生吗?
我想知道里面发生了什么?
有没有办法解决这个问题,但仍然保持完整的 2 AFTER INSERT触发器?
疯狂的情况。
小智 5
您的问题与 SQL Server 中的嵌套触发器概念有关。这个概念在MSDN 中解释如下
当触发器执行启动另一个触发器的操作时,DML 和 DDL 触发器都是嵌套的。这些操作可以启动其他触发器,依此类推。DML 和 DDL 触发器最多可以嵌套 32 级。
特别是您的问题,您可以将nested_triggers
配置限制为 0,以便触发器仅执行一次。
首先,我们将nested_triggers
值设置为0
。但是,此选项是在服务器级别上考虑到这一点的。
sp_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO
Run Code Online (Sandbox Code Playgroud)
然后我们将重新执行您的查询,a 的结果集将如下所示。
+----+
| id |
+----+
| 0 |
| 2 |
| 1 |
+----+
Run Code Online (Sandbox Code Playgroud)