【问题标题】:SQL Server 2005 - Trigger Loop?SQL Server 2005 - 触发循环?
【发布时间】:2009-04-03 17:41:42
【问题描述】:

我是第一次使用触发器。

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    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() 也很有用,但我发现它很脆弱(依赖于列的位置而不是列名)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 2010-09-14
        • 1970-01-01
        • 2014-10-09
        • 2011-09-06
        相关资源
        最近更新 更多