我遇到了一个挑战,涉及合并两个完全位于不同SQL服务器数据库中的应用程序。每个数据库都维护自己的内部数据库ID,它们是5,000,000范围内的有序整数。我正在使用一种通过标准API导入数据的工具。
我面临的主要挑战与合并数据集后的父和子关系的参照完整性有关。请参考下表中的示例。每个应用程序都具有相同的数据结构,但其数据是唯一的。我们想 所有数据都驻留在一个系统中。
一个例子是项目对象,它有多个任务,每个任务可以分配多个资源。括号中是每个对象类型的内部数据库序列ID(主键)。每个项目都是唯一的,每个项目的每个任务都是唯一的,但可以跨项目和任务分配相同的资源。
Project 1 (PROJECT ID 5000001)
Task A ( TASK ID 5000001)
Resource X (RESOURCE ID 5000001)
Resource Y (RESOURCE ID 5000002)
Task B ( TASK ID 5000002)
Resource Y (RESOURCE ID 5000002)
Resource Z (RESOURCE ID 5000003)
Project 2 (PROJECT ID 5000002)
Task A (TASK ID 5000003)
Resource Z (RESOURCE ID 5000003)
Task B (TASK ID 5000003)
Resource X (RESOURCE ID 5000001)
Project 3 (PROJECT ID 5000001)
Task C ( TASK ID 5000001)
Resource F (RESOURCE ID 5000001)
Resource G (RESOURCE ID 5000002)
Task D ( TASK ID 5000002)
Resource G (RESOURCE ID 5000002)
Resource H (RESOURCE ID 5000003)
Project 4 (PROJECT ID 5000002)
Task A (TASK ID 5000003)
Resource H (RESOURCE ID 5000003)
Task B (TASK ID 5000004)
Resource F (RESOURCE ID 5000001)
根据上面的数据,您可以看到,由于预先存在的PROJECT ID 5000001,项目1与系统0的合并将如何覆盖目标系统1中的项目3。
我的问题是如何在保持参照完整性的同时合并数据?我的第一个想法是创建一个视图,它将来自两个系统的数据集合并为每个对象,并以某种方式更新将要导入的记录,还存储新的内部ID并将新的引用ID级联到相关对象。有更简单的方法吗?
是否有可以自动执行此操作的工具?
答案 0 :(得分:1)
我建议使用Redgate sql数据比较工具。虽然它不是免费但值得。这是link
答案 1 :(得分:0)
由于您只有2,因此一个选项是“消极”。
如果您正在使用int或big int以及您的代理键数据类型.....并且您在(1,1)(或类似)启动了所有种子,您可以否定一个数据库的代理
但是,您可能拥有检查“> 0”的客户端代码,这可能会让您感到不安。
请记住,范围实际上是:
MySurrogateKey int IDENTITY (-2147483648,1)
(至positve 2147483648)......它不必从1(或0)开始。
答案 2 :(得分:0)
这不会特别容易,但您可以在单个(大型)存储过程中执行整个操作。
我会做什么(个人方法,其他人可能采取不同的方式)是使用每个现有数据库创建一个SQL Server实例,另外三个最初是“空”。我会编写一个存储过程,它将读取第一个数据库中的所有表,并将它们写入第三个数据库,向ID字段添加10,000,000(一千万)。这将使您的5000001变为15000001。存储过程中的后续步骤将更新指向这些PK的所有外键,以便为每个PK添加10,000,000。
您可以通过向第二个项目数据库的ID字段添加20,000,000来执行类似的过程,然后将新重新编号的表写出到数据库4.然后,您将按照前面的描述更新外键字段。您在完成此阶段时所拥有的是在组合项目中不同的记录。
然后,您可以将相应数据库3和数据库4表中的选择插入到其数据库5目标中。这会将表格组合成一个全局不同的奇点。