2011-05-09 72 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 = ... 
相關問題