2013-12-16 44 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