2017-08-08 158 views
2

我是新来的触发器,但我很难理解,如果我在这里采取正确的做法。删除SQL Server触发器 - 哪些记录在删除表中?

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

我也有一个Activities表记录任何创建或更新我的任何表。该表格有一个TableName文本列以及一个IdRow列,该列引用了创建或更新的行的ID。我还有一个JSONChanges列,其中包含该活动日志项目中更改的JSON字符串。

所以在表格上每个Activity只有1条记录。但是每个记录可能会执行许多活动。

所以,当用户删除一个团队,我不仅要删除所有记录的那支球队和那支球队的小组成员(这是很容易我Team_Delete存储过程中做)的Activities的,但我也想要删除我的Activities表中TeamMembers上活动的任何记录。由于Activities表的IdRow列点在TeamMembers表中的列中,因此我无法使用删除存储过程中的TeamID

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

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

我所遇到的困惑与在任何给定时间将在删除表中的记录有关。如果用户A删除了TeamMember,并且同时用户B在另一个Team Member上运行了更新,那么删除的表中是否有2条记录?如果我根据删除表中的内容删除活动表中的所有记录,那么我将删除不应删除的记录。对?

另一个问题是我该如何挑选一条记录来删除?我如何知道删除表中的哪个记录是我想要触发的那个记录?

+1

欢迎所以!看看这篇文章,这将帮助你以更可能被回答的方式来优化你的问题。 –

+1

删除表中的唯一记录是在单个批次中删除的记录。如果多行被删除,那么删除的表将包含所有被删除的记录。您可以将已删除的表格加入其他表格中,以确定还应该删除其他内容。看看这篇文章展示了如何限制删除和更新连接。 http://www.tech-recipes.com/rx/56823/delete-update-rows-using-inner-join-sql-server/ – Jeremy

+0

你是否用你的表格之间的外键强制引用完整性(这好像是一种情况你应该在哪里)?如果是这样,你可以添加'在删除级联'和SQL服务器将为您处理这些删除,不需要触发器。 – Greenspark

回答

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'; 

我也将使用级联的团队和TeamMembers之间的外键关系删除。

[编辑2017年8月9日12:45修正a.TableName加入]

+0

这就是我一直在寻找的。谢谢! –

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';