2

我是第一次使用触发器。

如果我通过同一张表上的更新触发器更新表中的字段,这会引发循环吗?sql server 是否防止这种递归行为?

谢谢

4

2 回答 2

3

此页面(搜索RECURSIVE_TRIGGERS)描述了可用于修改此行为的一些数据库设置。此外,保护您的过程的一种方法是使用UPDATE()函数或COLUMNS_UPDATED()函数。

例如,如果您有一个包含 、 和 列的表AB并且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()也很有用,但我发现它很脆弱(依赖于列的位置而不是列名)。

于 2009-04-03T17:52:56.690 回答
1

您可以通过 RECURSION_TRIGGER 选项在数据库级别控制触发器的递归;它默认关闭。即使开启此选项,也有 32 层嵌套触发器的限制;如果您的退出条件在达到 32 个级别的限制之前没有停止递归,则所有更改都将回滚。

于 2009-04-03T18:09:42.687 回答