TSQL:获取受级联删除影响的所有表

Cam*_*llo 2 t-sql cascade

我正在寻找一个 SQL 脚本,该脚本将列出从表 X 中删除记录时将受到影响的所有表。它还应该列出“树”下受影响的依赖表,因为受影响的表将对其他表进行级联删除,这反过来又会影响其他人等等。

Gar*_*thD 9

您可以使用递归 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

db<>fiddle 示例