【问题标题】:Extract subset of data from database based on FKs, and import to another database基于FK从数据库中提取数据子集,并导入另一个数据库
【发布时间】:2018-05-08 15:18:00
【问题描述】:

考虑一个包含 50-100 个表的数据库,all 可以直接和间接(最多 4-5 个关系深度)将 all 其 FK 依赖关系追溯到“Table1” .

原则上,如果删除了 Table1 的一条记录,并启用了级联删除,则将从所有表中删除一部分数据。

我的目标不是删除这些数据;相反,我希望能够编写脚本(复制,而不是删除)将数据子集写入文件。然后我希望能够将该数据导入另一个具有相同架构的非空数据库。当然,我需要保留所有这些关系,并且不与第二个数据库中的任何现有键发生冲突。

我意识到这是一项不平凡的任务。我找到的最接近的类似主题是here。 (编辑:此要求对于现有且成功的 SQL 数据库来说是新的。我知道它很丑陋并且可能不实用。)

我的问题是:我可以使用哪些工具和技术来简化这项任务?

我们正在使用 SQL Server,目前使用 .NET、EF6、C#。数据子集的大小约为 1-3 MB。

谢谢!

编辑:删除一些推测性陈述,并在下面添加示例表,我想在其中提取与 Table1 中的单个记录有关系的所有数据:

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

【问题讨论】:

  • 我理解这里提出的问题,但听起来确实存在一些严重的数据架构问题。您在这里要完成的是一个很容易被破坏的主要项目。您需要做的不仅仅是简单地复制数据。如果它不存在,您还必须复制任何相关数据。写这么复杂的东西需要几周甚至几个月的时间,而且性能会很糟糕。这绝对是一个 xy 问题。 xyproblem.info
  • 您能否更好地解释一下关于请求目的的商业案例?这可能有助于找到更好的解决方案。
  • 假设您有 table1 和 table2。 table2 中的行不仅有 table1 的外键,还有 table3 的外键。现在你说你需要维护所有的关系信息。因此,如果该行已从 table1 中删除,则在此过程中您将希望该行加上 table2 中的行。但是要维护所有关系数据,您现在还必须从 table3 复制数据。如果该信息引用另一个表怎么办?看看这是怎么回事?
  • 我认为这就是数据仓库存在的原因。我写了一些你想要的作为宠物项目的东西,但它很慢并且有局限性,而且由于我不断遇到的问题,我从未完成它。我认为@SeanLange 是正确的:这是一项艰巨的任务。
  • 不是你在烦我,而是我们在用完全模糊的术语说话。共享一些表格给了我们一些可靠的工作。我们不知道您的表结构是什么或您真正想要完成什么。

标签: c# .net sql-server entity-framework


【解决方案1】:

如果您希望 OnDelete 发生这种情况,我的第一个想法是您需要使用触发器,并且您需要在关系链中的每个父表上放置一个触发器,或者在“Table1”上放置一个触发器" 将需要调用一个贯穿整个链条的过程。

由于您首先要将已删除的数据写入文件,我猜您要填充的第二个数据库与第一个不在同一网络上。

因此,您可以使用单一触发器方法,让触发器填充一个表,该表仅包含从“Table1”中删除的行的 PK。然后启动一个调用 SSIS 包的作业。程序包读取表格以找出删除了哪一行,然后开始一系列数据流来创建您的文件。

最后,其他数据流会将文件上传到第二个数据库。这些数据流可能在同一个包中、不同的包中、相同的代理作业、不同的代理作业中,具体取决于详细信息中最有效的方法。

或者,如果您在每个父表上放置一个触发器,您可以让该触发器执行子表中相关行的批量导出。然后,计划的作业可以不时运行,并将找到的任何文件导入第二个数据库。

【讨论】:

  • 抱歉 - 这不是 OnDelete。我“只是”想根据该顶级 Table1 中的指定记录复制出数据子集。我已经添加了进一步的措辞来澄清这一点。不过有趣的想法!
  • 即使不发生OnDelete,我的整体策略还是基本一样,只是不是由触发器发起,而是可以由应用程序或定时作业发起。
【解决方案2】:

只要每个表都有一个主键,您就可以使用 SQL 数据比较工具执行此操作。该工具可以在这里找到:https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt?view=sql-server-ver15

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2011-11-20
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多