SQL Server 2005 - 触发循环?

时间:2009-04-03 17:41:42

标签: sql-server database sql-server-2005 triggers rdbms

我第一次使用触发器。

如果我通过同一个表上的更新触发器更新表中的字段,那么这个spark是一个循环吗? sql server是否可以防止这种递归行为?

由于

2 个答案:

答案 0 :(得分:3)

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

例如,如果您的表格中包含ABC列,并且您希望C的值在值时自动更改在列B中更新,您可以在触发器中保护呼叫:

CREATE TRIGGER Whatever ON TableName AFTER UPDATE
AS
BEGIN
    IF UPDATE(B)
    BEGIN
        /* Update column C here */
    END
END

这样,您可以避免在触发器更新列C时递归调用触发器。 COLUMNS_UPDATED()也很有用,但我发现它很脆弱(依赖于列的位置而不是列名)。

答案 1 :(得分:1)

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