Sql 更新后触发保持徽章计数
我在想我怎么能在我创建的一张桌子上用触发器来完成一些事情呢 我有以下表格: 客户帐户 阴蒂活动 在ClientAccount中,我有一个属性,它是客户端拥有的ClientActivity记录数的计数。我把这个数字当作标签上的徽章 每当创建新活动时,将触发以下触发器:Sql 更新后触发保持徽章计数,sql,sql-server,tsql,triggers,Sql,Sql Server,Tsql,Triggers,我在想我怎么能在我创建的一张桌子上用触发器来完成一些事情呢 我有以下表格: 客户帐户 阴蒂活动 在ClientAccount中,我有一个属性,它是客户端拥有的ClientActivity记录数的计数。我把这个数字当作标签上的徽章 每当创建新活动时,将触发以下触发器: SELECT ALL USE [officemgt] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER TRIGGER [dbo].[RecountInserte
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记录被删除,我会触发一个类似的触发器
这两个触发器工作得很好
问题是,有时一个活动可能会从一个客户端更改为另一个客户端。因此,我需要更新两个旧客户端的计数,以减少它,然后更新活动分配给的新客户端的计数
我如何才能做到这一点?您可以编写一个触发器,处理插入、更新和删除操作,如下所示:
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;
您可以编写一个单个触发器来处理插入、更新和删除操作,如下所示:
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
表<代码>插入包含所有新记录,删除
包含更新/删除触发器中的所有记录:
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
您可以使用
deleted
表<代码>插入包含所有新记录,删除
包含更新/删除触发器中的所有记录:
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
创建一个更新后触发器,并执行您现在正在执行的大部分操作?请检查此处的引用。正如您完全理解的,触发器中的“已删除”表不仅仅存在于删除触发器中,它还存在于更新触发器中,在这种情况下,它将保存更新前的值(因此Dale的答案是有效的,因为“已删除”表中的客户机ID是更改前的值)我注意到你没有接受一个问题的答案。在这个网站上,你要么接受最有用的答案,要么评论为什么答案不能解决你的问题。我鼓励你重新审视你的问题,并给出一些答案。另请看,对于类似的问题,基于索引视图的哪种解决方案更好,不需要触发器。何必麻烦呢?视图可以定义为“虚拟”执行此操作,而不需要复杂的触发器代码,并且视图始终是正确的。创建一个更新后触发器并执行您现在正在执行的大部分操作?请检查此处的引用。正如您完全理解的,触发器中的“已删除”表不仅仅存在于删除触发器中,它还存在于更新触发器中,在这种情况下,它将保存更新前的值(因此Dale的答案是有效的,因为“已删除”表中的客户机ID是更改前的值)我注意到你没有接受一个问题的答案。在这个网站上,你要么接受最有用的答案,要么评论为什么答案不能解决你的问题。我鼓励你重新审视你的问题,并给出一些答案。另请看,对于类似的问题,基于索引视图的哪种解决方案更好,不需要触发器。何必麻烦呢?可以将视图定义为“虚拟”执行此操作,而不需要复杂的触发器代码,并且视图始终是正确的。您可能需要提到需要创建“更新”触发器。触发器中的实际表名为“删除”和“插入”您可能需要提到需要创建一个“更新”触发器。触发器中的实际表名是“删除”和“插入”的。谢谢Dale,我实际上想知道是否可以在一个触发器中完成所有操作。我最喜欢这个解决方案。谢谢Dale,我真的想知道是否有可能在一个触发器中完成所有的操作。我最喜欢这个解决方案。