2013-12-16 3 views
0

У меня есть триггер, как показано ниже, логика заключается в изменении статуса FID после изменения статуса fidRule.sql server UPDATE TRIGGER не срабатывает

в моем приложении, i обновить 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 name, is_disabled FROM sys.triggers' –

+1

Ваш триггер предполагает, что только одна строка будет обновляться сразу. – MartW

+0

@CodeByMoonlight i обновляет 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