2011-05-09 42 views

回答

0

使用禁用触发语句,然后做你的更新如下

DISABLE TRIGGER Person.uAddress ON Person.Address; 
update .... 
ENABLE Trigger Person.uAddress ON Person.Address; 
+2

在我的理解中,'disable trigger'会影响其他更新,如果它们同时运行。你必须用桌子锁来包装 – Andomar 2011-05-09 06:15:46

0

您应该更改表和触发器。可能的解决方案之一是将列添加到表中,例如Triggered。当你进行“正常”更新时,你应该插入1.如果你需要避免更新,那么触发= 0。触发代码应该是:

IF EXISTS(SELECT * FROM INSERTED WHERE triggered=1) 
--here you trigger fired 
4

MSDN对如何use CONTEXT_INFO to disable a trigger只对单个会话的一个示例。

+0

Yikes!................. – 2011-05-09 06:29:00

+0

如果你将从同一连接开始几次更新,所有的更新都将被触发或避免。 – Dalex 2011-05-09 06:48:58

+1

@Dalex:你会在触发器上重置CONTEXT_INFO – gbn 2011-07-09 12:31:06

0

到Dalex的答案类似:

另一种解决方案是增加一列,像Triggered。在你的触发器中使用这样的东西。

IF NOT UPDATE(Triggered) 
BEGIN 
    RETURN; 
END 

UPDATE()仅仅检查,看是否将该柱包括在触发的,而不是无论是否该值被实际改变。如果您想要触发触发器的每个查询都有Triggered = 1,则会触发。没有这个的查询不会触发触发器。

您可以使用nvarchar列并使用原因字段作为标志和解释。

UPDATE Users 
    SET Password = ..encrypted_password.., 
     Reason = 'changed password' 
WHERE UserID = ... 

,然后如果你更新在登录时lastLogin场

IF NOT UPDATE(Reason) 
BEGIN 
    RETURN; 
END 

何在,你可能会排除的原因,土族触发器将不会触发。

UPDATE Users 
    SET LastLogin = getDate() 
WHERE UserID = ... 
相关问题