2013-12-16 177 views
0

我有一個像下面這樣的觸發器,邏輯是在fidRule狀態改變後更改FID狀態。SQL服務器UPDATE TRIGGER不會觸發

在我的應用程序,我更新每行1行, 但我發現有時(非常罕見)觸發器沒有發射。

ALTER TRIGGER [dbo].[triggerSetFIDStatus] 
    ON [dbo].[FIDRules] 
    AFTER UPDATE 
AS 

BEGIN 
set nocount on 

DECLARE @ruleStatus INT 
DECLARE @newRuleStatus INT 
DECLARE @FIDAlertStatus INT 

DECLARE @FIDId INT 
DECLARE @isFIDEnabled int 
DECLARE @ruleId INT 

SELECT @ruleStatus = deleted.alertStatus, 
    @FIDId = deleted.FIDID, 
    @ruleId = deleted.id 
from 
    deleted 

SELECT @newRuleStatus = inserted.alertStatus 
from 
    inserted 

SELECT @FIDAlertStatus = alertStatus, 
     @isFIDEnabled= isEnabled 
FROM FID 
WHERE id = @FIDId 


    IF @FIDAlertStatus <> @newRuleStatus 
    BEGIN 
     -- change FID-status by FIDRule-status 
     UPDATE [dbo].[FID] SET [email protected] WHERE [email protected] 
    END 

    IF @newRuleStatus >= 0 AND @newRuleStatus <> @ruleStatus 
     UPDATE [dbo].[FIDRules] SET isAlertStatChanged=1, AlertStatChangeTime = SYSUTCDATETIME() WHERE [email protected] 


END 
+0

您的觸發器是否啓用?檢查'SELECT名稱,is_disabled FROM sys.triggers' –

+1

你的觸發器假設只有一行是一次更新的。 – MartW

+0

@CodeByMoonlight我在每個語句中更新1行 –

回答

1

如果UPDATE語句失敗或觸發此觸發器之前未能執行其他觸發器,則不會觸發該觸發器。 您從DELETED期待一個記錄這並不總是正確的:你的觸發器本身

一個評論。

請您觸發足夠強大的情況下,DELETED包含多個記錄

-- What if deleted contains multiple records? 
SELECT @ruleStatus = deleted.alertStatus, 
    @FIDId = deleted.FIDID, 
    @ruleId = deleted.id 
FROM 
    deleted 

您可以使用SELECT TOP(1)或確保您的觸發器能夠從DELETED列表處理多個記錄。

+0

在我的應用程序中,我發送1次1更新語句,我是否仍然需要更改觸發器? –

+0

@Scott混合理論總是建議確保觸發器不會導致錯誤。如果您當時不會更改超過一條記錄,那麼我總是建議您選擇'SELECT TOP(1)',以確保沒有人能夠觸發您的觸發器,因爲他們不知道這個限制。 – hwcverwe

+0

您用來更新記錄的查詢是什麼? (應該觸發的查詢,但它沒有) – hwcverwe