出于审计目的,我正在尝试获取数据库的副本/导出,但仅包括每个表中与某个表中的一小部分行相关的行。所以这些行指向的每个表的每一行;每个表中指向这些行的每一行;等等。(在代数术语中,这是这些行相对于外键关系的传递对称自反闭包。)
我想知道是否存在某种工具可以做到这一点,或者这是否可以以某种方式编写脚本。我有大约 400 个表,外键网络很紧密,所以我不想手动执行此操作。
出于审计目的,我正在尝试获取数据库的副本/导出,但仅包括每个表中与某个表中的一小部分行相关的行。所以这些行指向的每个表的每一行;每个表中指向这些行的每一行;等等。(在代数术语中,这是这些行相对于外键关系的传递对称自反闭包。)
我想知道是否存在某种工具可以做到这一点,或者这是否可以以某种方式编写脚本。我有大约 400 个表,外键网络很紧密,所以我不想手动执行此操作。
您当然可以使用嵌套存储过程编写脚本:
EXEC recursive_shaped_query @StartTable='SomeTable', @KeyColumn='Id', @ValuesSQL='SELECT Id FROM (VALUES (1),(6),(4576),(42)) AS Ids(Id)'
SELECT * FROM SomeTable WHERE Id IN (SELECT Id FROM (VALUES (1),(6),(4576),(42)) AS Ids(Id))
sys.foreign_keys
找到任何引用该表的表并...EXEC recursive_shaped_query @StartTable='ReferencingTable', @KeyColumn='Id', @ValuesSQL='SELECT Id FROM SomeTable WHERE Id IN (SELECT Id FROM (VALUES (1),(6),(4576),(42)) AS Ids(Id))'
当然,会有一些复杂的情况需要考虑:
SELECT * FROM t1 WHERE Id IN (SELECT Id FROM t2 WHERE Id IN (SELECT Id FROM Tt3 WHERE ... )))
嵌套可能会变得很长,并且是由于表扫描而需要很长时间才能运行的查询。其他需要注意的事项:
对于我们在 [Day Job] 中的系统,我手动创建了一组这样的查询,以提取给定实体的嵌套数据,因为这些过程对诊断很有用,但我从来没有需要足够多的查询来保证尝试创建生成器或其他自动化解决方案。我一直认为它是一个游戏项目,但实际上并没有这样做。