2013-02-13 3 views
2

У меня есть две таблицыТриггер иногда не срабатывает при обновлении и вставке

Первая таблица Listexecutionaction, которая состоит из no. действий. Строка таблицы следующим образом:

QueueId ActionId Executed 
135  44   1 
135  45   1 
135  46   1 
135  47   1 
135  48   1 

Вторая таблица Listqueue, которая состоит из сводки итоговых действий. Структура следующим

DDBMSKEY NoOfActivities Completed 
135   5    3 

Мое требование для каждого вставки и обновления на Listexecutionaction таблицы следует вычислить NoOfActivities и № действия завершены. Для этого я написал триггер по таблице в ListExecutionaction следующим образом.

ALTER TRIGGER [Common].[ActivityStatus_AfterInsertUpdate] ON [Common].[ListExecutionAction] AFTER Insert,Update 
AS 
BEGIN 
    UPDATE COMMON.LISTQUEUE 
    SET 
     NOOFACTIVITIES= 
        (SELECT count(ID) FROM common.listexecutionaction WHERE queueid=lstact.queueid), 
     Completed= 
        (SELECT count(ID) FROM common.listexecutionaction WHERE queueid=lstact.queueid And Executed=1) 
    FROM common.listqueue lstqueue left join common.listexecutionaction lstact 
    ON lstqueue.DDBMSKey= lstact.queueid 
    WHERE lstqueue.DDBMSKey in (Select queueid from Inserted) 

END 

Мой желаемый результат для таблицы Listqueue должен быть следующим

DDBMSKEY NoOfActivities Completed 
135  5    5 

Но иногда триггер расчета неправильного результата нет. выполненных действий и дающих результат в качестве

DDBMSKEY NoOfActivities Completed 
135  5    3 

Пожалуйста, сообщите, что не так в триггере. Иногда он работает нормально и не работает. Я хочу, чтобы вызвать как на Insert и Update

+0

Вы проверили, выполнено ли 'Executed = 1' для всех 5 записей? – Bulat

+0

Да, это не относится к 5 записям, это основано на правильном условии. – Hussain

+0

, поэтому все записи имеют Executed = 1? – Bulat

ответ

0

кажется, что ваш запрос может быть упрощен следующим образом:

ALTER TRIGGER [Common].[ActivityStatus_AfterInsertUpdate] 
    ON [Common].[ListExecutionAction] AFTER Insert,Update 
    AS 
    BEGIN 
     UPDATE COMMON.LISTQUEUE 
     SET 
      NOOFACTIVITIES= 
         (SELECT count(ID) 
         FROM common.listexecutionaction 
         WHERE queueid=lstact.queueid), 
      Completed= 
         (SELECT count(ID) 
         FROM common.listexecutionaction 
         WHERE queueid=lstact.queueid And Executed=1) 
     WHERE lstqueue.DDBMSKey in (Select queueid from Inserted) 

    END 

Я не думаю, что будет решить эту проблему, по крайней мере запрос короче.

Смежные вопросы