SSIS在数据库之间移动数据 - 维护参照完整性

时间:2017-10-27 16:23:05

标签: sql-server ssis foreign-keys sql-server-data-tools control-flow

我需要在两个数据库之间移动数据,并希望了解SSIS是否是一个好工具。我已将以下解决方案拼凑在一起,但它比我希望的要复杂得多 - 对于解决这个问题的更好方法的任何见解都将不胜感激!

那是什么让我的情况与众不同;我们拥有大量数据,因此为了保持系统性能,我们将客户分成多个数据库服务器。这些服务器具有相同模式的数据库,但每个数据库都填充有唯一数据。有时,我们需要将客户的数据从一台服务器移动到另一台服务器。因此,简单地重新创建表并将数据移动到位将不起作用,因为在服务器A上的数据库中可能有20条记录,但是在服务器B上的数据库的同一表中可能有30条记录。所以当将记录20从A移动到B,需要分配ID 31 。越过这一点并不困难,但是当需要移动具有外键引用的表时,麻烦就出现了,因为现在的记录就是31 ....

一个例子: 这是一个简单示例的示例模式:

Sample Schema

有一个跟踪制造商的表格,以及一个跟踪每个参考制造商的产品的表格。

源数据库中的数据示例:

Source Data

为了在保持关系完整性的同时处理这些数据,我采用了收集制造商记录,循环遍历它们以及移动相关产品的每个制造商的方法。以下是SSDT中控制流程的高级视图:

Control Flow

第一个数据流从源数据库中获取记录并将它们拉入Recordset Destination:

Manufacturer Data Flow

OLE DB Source在拉动所有列时从源数据库制造商表中提取,并将其放入记录集中:

Manufacturer Data Flow Details

回到控制流程中,然后我遍历制造商记录集中的记录:

Manufacturer Foreach Loop

对于制造商记录集中的每个记录,我然后执行一个SQL任务,该任务确定下一个可用的自动递增ID将在目标数据库中,插入记录,然后返回SELECT MAX(ManufacturerID)的结果执行SQL任务结果集,以便在将相关产品插入目标数据库时可以使用新创建的制造商ID:

Manufacturer Insert SQL Query

上面的可以正常工作,但是一旦你获得了超过几层相互引用的表格,这就不再是非常稳固了。有一个更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以随时尝试:

  1. 填写制造商表格。
  2. 获取您的产品数据(确保您有名称等参考给制造商)
  3. 使用查找来获取您的姓名或您选择的任何内容匹配的ID。
  4. 插入数据库。
  5. 这将保留您的FK约束,并且不要求您执行所有最大键选择。