基于 FK 从数据库中提取数据子集,并导入到另一个数据库



考虑一个包含 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

最新更新