更新触发器后维护徽章计数

After Update Trigger to Maintain Badge Count

我想知道如何在我创建的 table 上使用触发器来完成某些事情?

我有以下 table: 客户帐号 客户端活动

在 ClientAccount 中,我有一个属性,它是对客户拥有的 ClientActivity 记录数的计数。我将该计数用作选项卡上的徽章。

每当创建新的 activity 时,都会触发以下触发器:

SELECT ALL

USE [officemgt]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[RecountInsertedClientActivities] 
   ON  [dbo].[CLIENTACTIVITY]
   AFTER INSERT 
AS 
BEGIN

    SET NOCOUNT ON;

    UPDATE CLIENTACCOUNT
    SET Count_ClientActivitiesAsClient=(SELECT COUNT(*) FROM ClientActivity WHERE ClientActivity.parent_Client_RID=CLIENTACCOUNT.ID)
    FROM inserted
    LEFT JOIN CLIENTACCOUNT ON CLIENTACCOUNT.ID=inserted.parent_Client_RID

END

然后我有一个类似的触发器,如果​​ ClientActivity 记录被删除,它会触发。

这两个触发器工作得很好。

问题是有时 activity 可能会从一个客户端更改为另一个客户端。因此,我需要更新两个旧客户端的计数以减少它,然后更新 activity 分配给的新客户端的计数。

我该怎么做?

您可以编写一个单个触发器来处理插入、更新和删除,如下所示:

ALTER TRIGGER [dbo].[RecountInsertedClientActivities] 
   ON  [dbo].[CLIENTACTIVITY]
   AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE CA SET
        Count_ClientActivitiesAsClient = (SELECT COUNT(*) FROM dbo.ClientActivity CV WHERE CV.parent_Client_RID = CA.ID)
    FROM dbo.CLIENTACCOUNT CA
    WHERE CA.ID in (SELECT I.parent_Client_RID FROM INSERTED I UNION ALL SELECT D.parent_Client_RID FROM DELETED D);
END;

您可以使用 deleted table。 inserted 包含所有新记录,deleted 包含您的 update/delete 触发器中的所有所有记录:

  UPDATE CLIENTACCOUNT
    SET Count_ClientActivitiesAsClient=(SELECT COUNT(*) FROM ClientActivity WHERE ClientActivity.parent_Client_RID=CLIENTACCOUNT.ID)
    FROM inserted
    LEFT JOIN CLIENTACCOUNT ON CLIENTACCOUNT.ID=inserted.parent_Client_RID


  UPDATE CLIENTACCOUNT
    SET Count_ClientActivitiesAsClient=(SELECT COUNT(*) FROM ClientActivity WHERE ClientActivity.parent_Client_RID=CLIENTACCOUNT.ID)
    FROM deleted
    LEFT JOIN CLIENTACCOUNT ON CLIENTACCOUNT.ID=deleted.parent_Client_RID