【发布时间】:2022-01-20 00:43:39
【问题描述】:
对于此示例,启用和禁用触发器的替代方法是什么? 这是我的触发器,我有一个场景,它不应该被允许直接更新 Table33 中的列 Column33(通过执行查询 UPDATE Table33 SET Column33='123'),但它应该被允许从其他列更新该列正在执行某些计算的触发器。当我在其他触发器中禁用触发器 Triger33,在触发器内部进行更新然后再次启用此触发器时,它会起作用。这个解决方案不好。有没有办法可以给这个触发器设置某种条件,以便它允许不直接的更新,这样我就可以避免在其他触发器中禁用和启用?
create trigger [dbo].[Trigger33]
on [dbo].[Table33]
AFTER UPDATE
as
if UPDATE(Column33)
begin
raiserror('It is not allowed to update Column33 in Table33', 16,1)
rollback
end
【问题讨论】:
-
添加 "AND @@TRIGGER_NESTLEVEL = 1" 能解决问题吗?
-
您可能还需要检查值是否实际更改:“AND EXISTS(SELECT * FROM INSERTED I JOIN DELETED D ON D.ID = I.ID WHERE I.Column33 D.第 33 列)”。如果需要考虑空值或区分大小写,则比较可能需要稍微复杂一些。
-
在另一个触发器中设置
CONTEXT_INFO,并在这个触发器中检查。 -
或者使用更现代的
session_context允许触发器彼此聊天。
标签: sql sql-server tsql triggers