SQL Server-Table 有许多插入表本身的 AFTER INSERT 触发器

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)