我第一次使用触发器。
如果我通过同一个表上的更新触发器更新表中的字段,那么这个spark是一个循环吗? sql server是否可以防止这种递归行为?
由于
答案 0 :(得分:3)
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()
也很有用,但我发现它很脆弱(依赖于列的位置而不是列名)。
答案 1 :(得分:1)
您可以通过RECURSION_TRIGGER选项控制数据库级别的触发器递归;它默认关闭。即使启用此选项,也会有32个嵌套级别的触发器限制;如果退出条件在达到32级限制之前没有停止递归,则所有更改都将回滚。