【发布时间】:2009-04-03 17:41:42
【问题描述】:
我是第一次使用触发器。
如果我通过同一张表上的更新触发器更新表中的字段,这会引发循环吗? sql server 会防范这种递归行为吗?
谢谢
【问题讨论】:
标签: sql-server database sql-server-2005 triggers rdbms
我是第一次使用触发器。
如果我通过同一张表上的更新触发器更新表中的字段,这会引发循环吗? sql server 会防范这种递归行为吗?
谢谢
【问题讨论】:
标签: sql-server database sql-server-2005 triggers rdbms
This page(搜索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 个级别的限制之前没有停止递归,则所有更改都将回滚。
【讨论】: