sql server UPDATE TRIGGER不会触发

时间:2013-12-16 09:08:00

标签: sql-server-2008 tsql triggers

我有一个如下所示的触发器,逻辑是在fidRule状态改变后改变FID状态。

在我的应用中,我在每个语句中更新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 alertStatus=@newRuleStatus WHERE id=@FIDId
    END

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


END

1 个答案:

答案 0 :(得分: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列表中的多条记录。