我是触发器的新手,但是我很难理解我是否采取了正确的方法。
我正在使用SQL Server 2016.我有2个表,100144
和Teams
。 TeamMembers
是父表,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个记录?如果我根据删除表中的内容删除活动表中的所有记录,那么我将删除不应删除的记录。正确?
另一个问题是如何选择一个要删除的记录?我怎么知道删除表中哪条记录是我想要的触发器?
答案 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';