我正在寻找一个 SQL 脚本,该脚本将列出从表 X 中删除记录时将受到影响的所有表。它还应该列出“树”下受影响的依赖表,因为受影响的表将对其他表进行级联删除,这反过来又会影响其他人等等。
您可以使用递归 CTE 生成受影响表的完整层次结构,例如
WITH OnDelete AS
( SELECT f.parent_object_id,
f.referenced_object_id,
RecursionLevel = 1,
ObjectTree = CONVERT(VARCHAR(MAX), CONCAT(OBJECT_NAME(f.parent_object_id), ' --> ', OBJECT_NAME(f.referenced_object_id)))
FROM sys.foreign_keys AS f
WHERE f.delete_referential_action_desc = 'CASCADE'
UNION ALL
SELECT od.parent_object_id,
f.referenced_object_id,
od.RecursionLevel + 1,
ObjectTree = CONVERT(VARCHAR(MAX), CONCAT(od.ObjectTree, ' --> ', OBJECT_NAME(f.referenced_object_id)))
FROM OnDelete AS od
INNER JOIN sys.foreign_keys AS f
ON f.parent_object_id = od.referenced_object_id
AND f.delete_referential_action_desc = 'CASCADE'
)
SELECT BaseTable = OBJECT_NAME(od.parent_object_id),
OnDelete = od.ObjectTree
FROM OnDelete AS od
WHERE NOT EXISTS
( SELECT 1
FROM OnDelete AS ex
WHERE ex.parent_object_id = od.parent_object_id
AND ex.ObjectTree LIKE CONCAT(od.ObjectTree, '%')
AND LEN(ex.ObjectTree) > LEN(od.ObjectTree)
)
ORDER BY od.parent_object_id;
Run Code Online (Sandbox Code Playgroud)
这将输出类似:
| 基表 | 删除时 |
|---|---|
| T2 | T2 --> T1 |
| T3 | T3 --> T2 --> T1 |
| T4 | T4 --> T3 --> T2 --> T1 |
| T5 | T5 --> T4 --> T3 --> T2 --> T1 |