考虑一个包含 50-100 个表的数据库,所有这些表都可以直接或间接(最多 4-5 个关系深度(将其所有FK 依赖项追溯到"Table1"。
原则上,如果删除了 Table1 的一条记录,并启用了级联删除,则会从所有表中删除数据子集。
我的目标不是删除这些数据;相反,我希望能够将这些数据子集脚本输出(复制,而不是删除(到文件中。然后,我希望能够将该数据导入到具有相同架构的另一个非空数据库中。当然,我需要保留所有这些关系,并且不与第二个数据库中的任何现有键发生冲突。
我意识到这是一项不平凡的任务。我发现的最接近的类似主题在这里。 (编辑:此要求对于现有且成功的 SQL 数据库来说是新的。我知道这很丑陋,可能不实用。
我的问题是:我可以使用哪些工具和技术来简化此任务?
我们使用的是SQL Server,目前使用的是.NET,EF6,C#。数据子集的大小约为 1-3 MB。
谢谢!
编辑:删除一些推测性语句,并在下面添加示例表,我想在其中提取与表1中单个记录关系的所有数据:
Table1
Table1_Id (PK)
Data1
Foo
Foo_Id (PK)
Table1_Id (FK)
FooData
Bar
Bar_Id (PK)
Table1_Id (FK)
BarData
Ding
Ding_Id (PK)
Foo_Id (FK)
Bar_Id (FK)
DingData
如果您希望在 OnDelete 上发生这种情况,我的第一个想法是您需要使用触发器,并且您需要在关系链中的每个父表上放置一个触发器,或者"Table1"上的一个触发器需要调用一个一直沿链向下的过程。
由于您首先要将已删除的数据写入文件,因此我猜您要填充的第二个数据库与第一个数据库不在同一网络上。
因此,您可以使用单个触发器方法执行的操作是让触发器填充一个表,该表仅具有从"Table1"中删除的行的PK。 然后启动调用 SSIS 包的作业。 包读取表以找出已删除的行,然后开始一系列数据流来创建文件。
最后,其他数据流会将文件上传到第二个数据库。 这些数据流可能位于同一包、不同包、同一代理作业、不同代理作业中,具体取决于详细信息中最有效的内容。
或者,如果在每个父表上放置一个触发器,则可以让该触发器执行子表中相关行的批量导出。 然后,计划作业可以不时运行,并将其找到的任何文件导入第二个数据库。
可以使用 SQL 数据比较工具执行此操作,只要每个表都有一个主键即可。该工具可以在这里找到:https://learn.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt?view=sql-server-ver15
考虑使用开源(MIT 许可证(SqlSizer 项目。 我认为您应该能够使用该工具实现您想要的。
它允许轻松找到该数据的子集,提取它并复制到空数据库。
项目网站: https://github.com/sqlsizer/mssql-sqlsizer