触发器有时不会在Update和Inserted上触发

时间:2013-02-13 14:41:50

标签: sql triggers

我有两张桌子

第一个表Listexecutionaction由no组成。行动表的结构如下

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

第二个表列表队列,包括已完成的总动作的摘要。结构如下

DDBMSKEY    NoOfActivities   Completed
135         5                3

我的要求是对于Listexecutionaction表上的每个Insert和Update,它应该计算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

请告知触发器有什么问题。有时它工作正常并且有时失败。 我想在插入和更新

上触发

1 个答案:

答案 0 :(得分: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

我认为这不会解决问题,至少查询会更短。