Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新后触发保持徽章计数_Sql_Sql Server_Tsql_Triggers - Fatal编程技术网

Sql 更新后触发保持徽章计数

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

我在想我怎么能在我创建的一张桌子上用触发器来完成一些事情呢

我有以下表格: 客户帐户 阴蒂活动

在ClientAccount中,我有一个属性,它是客户端拥有的ClientActivity记录数的计数。我把这个数字当作标签上的徽章

每当创建新活动时,将触发以下触发器:

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,我真的想知道是否有可能在一个触发器中完成所有的操作。我最喜欢这个解决方案。