删除时SQL Server触发器-删除表中有哪些记录?

删除时SQL Server触发器-删除表中有哪些记录?,sql,sql-server,Sql,Sql Server,我不熟悉触发器,但我很难理解我是否在这里采取了正确的方法 我正在使用SQL Server 2016。我有两个表,团队和团队成员Teams是父表,TeamMembers是子表,使用Teams.TeamID作为外键 我还有一个Activities表,记录我的任何表的创建或更新。此表有一个TableName文本列以及一个IdRow列,该列引用创建或更新的行的ID。我还有一个JSONChanges列,其中包含一个JSON字符串,其中包含在活动日志项中更改的内容 因此,表中的每个活动只有一条记录。但每个记

我不熟悉触发器,但我很难理解我是否在这里采取了正确的方法

我正在使用SQL Server 2016。我有两个表,
团队
团队成员
Teams
是父表,
TeamMembers
是子表,使用
Teams.TeamID
作为外键

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

因此,表中的每个
活动
只有一条记录。但每个记录可能执行许多活动

因此,当用户删除一个团队时,我不仅需要删除为该团队记录的所有
活动
,还需要删除该团队的团队成员(这在我的
team\u delete
存储过程中很容易做到),但是我还想删除我的
Activities
表中
TeamMembers
上的活动的所有记录。由于
Activities
表的
IdRow
列指向
TeamMembers
表中的
TeamMemberID
列,因此我无法使用delete存储过程中的
TeamID

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

无论何时删除
团队成员
,我都可以删除
活动
日志中指向已删除记录的所有记录。这将简化我的
Team\u DELETE
存储过程。我想

我所遇到的混乱与在任何给定时间都将被删除的表中的记录有关。如果用户A删除一个团队成员,同时用户B对另一个团队成员运行更新,那么删除的表中不是有2条记录吗?如果我根据已删除表中的内容删除活动表中的所有记录,那么我正在删除不应该删除的记录。对吧?


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

如果我必须对团队成员使用触发器,我会尝试:

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';
我还将对团队和团队成员之间的外键关系使用级联删除


[编辑2017年9月8日12:45更正a.TableName连接]

仅供参考,我稍微编辑了一下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';

欢迎来到SO!查看这篇文章,它将帮助您以一种更容易得到回答的方式完善您的问题。删除表中唯一的记录是在单个批次中删除的记录。如果删除了多行,则已删除的表将保存已删除的所有记录。您可以将已删除的表连接到其他表中,以确定还应删除哪些表。查看这篇文章,展示如何使用联接限制删除和更新。您是否在表之间使用外键强制引用完整性(这似乎是您应该执行的情况)?如果是这样,您可以添加“On Delete Cascade”,SQL server将为您处理这些删除操作,无需触发器。我在团队和团队成员之间执行了此操作,但没有在活动表上执行此操作,而活动表正是我执行此操作的地方“我正试图从中删除。IdRow列指向数据库中任何表的主键字段。我对
Activities
表的角色有点困惑。它是在
TableName
IdRow
中键入的,其中
IdRow
是该表中的id值?您可以考虑每个基表有一个不同的活动表。然后,您可以在这两者之间使用外键,并指定了“删除级联”。然后,当您从引用表中删除某些内容时,它会自动从引用表中删除。这就是我要查找的内容。非常感谢。