在某些情况下禁用更新触发器

时间:2011-05-09 06:05:39

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

我已经编写了一个更新触发器,因此每次更新时触发器都会运行。 但只是对于我的一个更新语句,我不希望触发器发生。 如何暂时禁用触发器?

4 个答案:

答案 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 = ...