0

我有一个挑战,它涉及合并两个完全位于不同 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)            

系统一

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,从系统 0 合并项目 1 将如何覆盖目标系统 1 中的项目 3。

我的问题是如何在保持参照完整性的同时合并数据?我的第一个想法是创建一个视图,该视图将来自两个系统的每个对象的两个数据集结合起来,并以某种方式更新将要导入的记录,并存储新的内部 ID 并将新的引用 ID 级联到相关对象。有没有更简单的方法?

有没有可以自动化的工具?

4

3 回答 3

1

我建议使用 Redgate sql 数据比较工具。它不是免费的,但值得。这是它的链接

于 2013-06-12T19:05:56.323 回答
0

这不会特别容易,但是您可以在单个(大型)存储过程中执行整个操作。

我会做的(个人方法,其他人可能会以不同的方式做)是使用每个现有数据库和另外三个最初“空”的数据库创建一个 SQL Server 实例。我将编写一个存储过程,该过程将从第一个数据库中读取所有表并将它们写入第三个数据库,将 10,000,000(一千万)添加到 ID 字段中。这您的 5000001 将变为 15000001。存储过程中的后续步骤将更新所有指向这些 PK 的外键,以将 10,000,000 添加到每个 PK。

您将遵循类似的过程,将 20,000,000 添加到第二个项目数据库的 ID 字段,并将新重新编号的表写入数据库 4。然后您将更新外键字段,如前面案例所述。在此阶段完成时,您拥有的是在组合项目中不同的记录。

然后,您将从各自的数据库 3 和数据库 4 表中的选择插入到它们的数据库 5 目标中。这会将这些表组合成一个全局独特的奇点。

于 2013-06-13T06:08:22.687 回答
0

由于您只有 2 个,因此一种选择是“否定”。

如果您使用 int 或 big int 以及您的代理键数据类型......并且您在 (1,1) (或类似)处开始了所有播种,您可以否定一个数据库的代理项。

但是,您可能有检查“> 0”的客户端代码,这可能会让您感到困惑。

请记住,范围实际上是:

MySurrogateKey  int IDENTITY (-2147483648,1) 

(至 positve 2147483648 )...它不必从 1(或 0)开始。

于 2013-06-12T18:59:17.513 回答