我有一个如下所示的触发器,逻辑是在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
答案 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
列表中的多条记录。