更新触发器后维护徽章计数
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
我想知道如何在我创建的 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