我是第一次使用触发器。
如果我通过同一张表上的更新触发器更新表中的字段,这会引发循环吗?sql server 是否防止这种递归行为?
谢谢
我是第一次使用触发器。
如果我通过同一张表上的更新触发器更新表中的字段,这会引发循环吗?sql server 是否防止这种递归行为?
谢谢
此页面(搜索RECURSIVE_TRIGGERS
)描述了可用于修改此行为的一些数据库设置。此外,保护您的过程的一种方法是使用UPDATE()
函数或COLUMNS_UPDATED()
函数。
例如,如果您有一个包含 、 和 列的表A
,B
并且C
您希望在更新C
列中的值时自动更改 的值,B
则可以保护触发器中的调用:
CREATE TRIGGER Whatever ON TableName AFTER UPDATE
AS
BEGIN
IF UPDATE(B)
BEGIN
/* Update column C here */
END
END
这样,当您的C
触发器更新列时,您可以避免递归调用触发器。 COLUMNS_UPDATED()
也很有用,但我发现它很脆弱(依赖于列的位置而不是列名)。
您可以通过 RECURSION_TRIGGER 选项在数据库级别控制触发器的递归;它默认关闭。即使开启此选项,也有 32 层嵌套触发器的限制;如果您的退出条件在达到 32 个级别的限制之前没有停止递归,则所有更改都将回滚。