已删除的SQL Server触发器 - 哪些记录在已删除的表中?

时间:2017-08-08 17:03:56

标签: sql sql-server

我是触发器的新手,但是我很难理解我是否采取了正确的方法。

我正在使用SQL Server 2016.我有2个表,100144TeamsTeamMembers是父表,Teams是子表,使用TeamMembers作为外键。

我还有一个Teams.TeamID表,可以记录任何创建或更新到我的任何表。此表有一个Activities文本列以及一个TableName列,它引用了创建或更新的行的ID。我还有一个IdRow列,其中包含该活动日志项中更改内容的JSON字符串。

因此桌面上每个JSONChanges只有1条记录。但是每条记录可能会进行很多活动。

因此,当用户删除团队时,我不仅需要删除该团队记录的所有Activity以及该团队的团队成员(这在Activities中很容易实现存储过程),但我还想删除Team_Delete表中Activities上的活动的所有记录。由于TeamMembers表的Activities列指向IdRow表中的TeamMemberID列,因此我无法使用删除存储过程中的TeamMembers。< / p>

我的想法是在TeamID表上创建一个删除触发器。

每当删除TeamMembers时,我都可以删除TeamMember日志中指向已删除记录的所有记录。这将简化我的Activities存储过程。我想。

我的困惑与任何给定时间将在已删除表中的记录有关。如果用户A删除了一个TeamMember,同时用户B在另一个团队成员上运行更新,那么删除的表中是否会有2个记录?如果我根据删除表中的内容删除活动表中的所有记录,那么我将删除不应删除的记录。正确?

另一个问题是如何选择一个要删除的记录?我怎么知道删除表中哪条记录是我想要的触发器?

2 个答案:

答案 0 :(得分:0)

如果我必须在TeamMembers上使用触发器,我会尝试:

CREATE TRIGGER [ schema_name .]DeleteTeamMemberActivities ON [ schema_name .]TeamMembers
AFTER DELETE   
AS 
 DELETE   
 FROM 
    Activities a 
    INNER JOIN DELETED d ON d.TeamMemberID = a.IdRow AND a.TableName ='TeamMembers';

我还会对Team和TeamMembers之间的外键关系使用级联删除。

[编辑08/09/2017 12:45更正a.TableName加入]

答案 1 :(得分:0)

仅供参考,我稍微编辑了cclarke的代码 - 这就是我最终的结果:

CREATE TRIGGER TRIGGER_DeleteTeamMemberActivities ON TeamMembers
AFTER DELETE   
AS 
 DELETE a
 FROM 
    Activities a 
    INNER JOIN deleted d ON d.TeamMemberID = a.IDRow AND a.TableName 
    ='TeamMembers';