SQL Server执行DELETE语句前如何确定关联表中需删除的记录
SQL Server 删除操作前预检查关联受影响记录的方法
你遇到的多行数受影响的情况,确实是由ON DELETE 级联外键约束或表上的 DELETE 触发器联动操作其他表导致的,你可以通过以下三种方法提前确认所有受影响的记录:
方法1:显式事务回滚预览(最适合入门用户,无数据修改风险)
这个方法会完全模拟 DELETE 语句的真实执行逻辑,但不会真的提交修改,你可以直观看到所有受影响的行数:
- 第一步:执行语句开启显式事务
BEGIN TRANSACTION; - 第二步:执行你的 DELETE 语句,可加
OUTPUT子句查看当前表删除的具体内容
DELETE Table1 OUTPUT DELETED.* WHERE COLUMN1 = 7
- 第三步:查看 SSMS 输出的所有受影响行数(包含级联外键、触发器触发的其他表删除行数),确认无误后如果要执行删除就运行
COMMIT TRANSACTION;,如果只是预览就运行回滚语句放弃所有操作:ROLLBACK TRANSACTION;
方法2:提前排查级联外键关联的子表
如果需要提前知道哪些关联表会被同步删除,可以查询系统视图获取所有开启了级联删除的关联表:
SELECT OBJECT_NAME(fk.parent_object_id) AS 关联子表名, c.name AS 子表关联列名, fk.delete_referential_action_desc AS 删除触发动作 FROM sys.foreign_keys fk INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id INNER JOIN sys.columns c ON fkc.parent_object_id = c.object_id AND fkc.parent_column_id = c.column_id WHERE OBJECT_NAME(fk.referenced_object_id) = 'Table1' AND fk.delete_referential_action = 1
拿到关联子表后,你可以对应写 SELECT 语句查询关联条件下的记录数,加总即可得到总删除行数。
方法3:排查表上的 DELETE 触发器
如果没有查询到级联外键,那额外的删除操作就是由 DELETE 触发器触发的,你可以通过下面的语句查询触发器逻辑:
SELECT name AS 触发器名称, OBJECT_DEFINITION(object_id) AS 触发器逻辑 FROM sys.triggers WHERE parent_id = OBJECT_ID('Table1') AND type = 'TR' AND OBJECTPROPERTY(object_id, 'ExecIsDeleteTrigger') = 1
解析触发器的逻辑后,即可知道会联动操作哪些表的记录。
操作 DELETE、UPDATE 这类高危 DML 语句前,建议默认开启显式事务确认后再提交,避免误删数据需要还原数据库的麻烦。
内容的提问来源于stack exchange,提问作者BlueTube
相关产品推荐
相关产品推荐

