我已经编写了一个更新触发器,因此每次更新时触发器都会运行。 但只是对于我的一个更新语句,我不希望触发器发生。 如何暂时禁用触发器?
答案 0 :(得分:4)
MSDN有一个如何use CONTEXT_INFO to disable a trigger仅针对单个会话的示例。
答案 1 :(得分:0)
使用禁用触发器语句,然后执行以下更新
DISABLE TRIGGER Person.uAddress ON Person.Address;
update ....
ENABLE Trigger Person.uAddress ON Person.Address;
答案 2 :(得分:0)
您应该更改表格和触发器。一种可能的解决方案是向表中添加列,例如Triggered。当您进行“正常”更新时,您应该插入1.如果您需要避免更新,则触发= 0。触发代码应为:
IF EXISTS(SELECT * FROM INSERTED WHERE triggered=1)
--here you trigger fired
答案 3 :(得分:0)
类似于Dalex的回答:
另一种解决方案是添加一列,例如Triggered
。并在你的触发器中使用这样的东西。
IF NOT UPDATE(Triggered)
BEGIN
RETURN;
END
UPDATE()
只是检查列是否包含在触发器中,而不是是否实际更改了值。如果要触发触发器的每个查询都有Triggered = 1
,则会触发。没有这个的查询不会触发触发器。
您可以使用nvarchar列并使用reason字段作为标志和解释。
UPDATE Users
SET Password = ..encrypted_password..,
Reason = 'changed password'
WHERE UserID = ...
然后
IF NOT UPDATE(Reason)
BEGIN
RETURN;
END
如果您在登录时更新lastLogin字段,则可能排除原因,触发器不会触发。
UPDATE Users
SET LastLogin = getDate()
WHERE UserID = ...