合并2个具有唯一ID的SQL Server数据库

时间:2013-06-12 18:33:03

标签: sql-server merge referential-integrity

我遇到了一个挑战,涉及合并两个完全位于不同SQL服务器数据库中的应用程序。每个数据库都维护自己的内部数据库ID,它们是5,000,000范围内的有序整数。我正在使用一种通过标准API导入数据的工具。

我面临的主要挑战与合并数据集后的父和子关系的参照完整性有关。请参考下表中的示例。每个应用程序都具有相同的数据结构,但其数据是唯一的。我们想 所有数据都驻留在一个系统中。

一个例子是项目对象,它有多个任务,每个任务可以分配多个资源。括号中是每个对象类型的内部数据库序列ID(主键)。每个项目都是唯一的,每个项目的每个任务都是唯一的,但可以跨项目和任务分配相同的资源。

系统0

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)            

系统1

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级联到相关对象。有更简单的方法吗?

是否有可以自动执行此操作的工具?

3 个答案:

答案 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目标中。这会将表格组合成一个全局不同的奇点。