将多个数据库迁移并合并为一个

时间:2009-03-05 21:11:21

标签: sql-server data-migration

在更新项目中,我必须执行以下操作:

将3个数据库从SQL2000移到SQL2005并同时合并它们。 SP和视图中已经有很多交叉数据库查询。 当前的计划是将每个旧数据库移动到1个数据库中的单独模式中。

这意味着我们还必须更改当前的SP和视图,我们现在有:

SELECT OrderId, OrderDate FROM Sales.dbo.Orders

并期望我们必须将其更改为

SELECT OrderId, OrderDate FROM Sales.Orders

问题是:我们如何尽可能自动化?

我知道SED和类似的更改脚本。我会欢迎有关如何“聪明”的提示,例如分区脚本的策略,性能(大量INSERT INTO行)等。

注意:我确实查看了导入/导出向导,但显然我必须在每个输出表上手动设置Schema,并通过ALTER脚本修复SP。

6 个答案:

答案 0 :(得分:6)

答案 1 :(得分:2)

你可以给Redgate SQL Compare和Data Compare一个镜头。它们具有模式映射功能,可以让您将dbo模式映射到另一个模式中的销售模式,然后移动表和过程。它会使你不必乱用SQL导出向导。你仍然需要重构你的其他对象。

我喜欢这两种工具。


编辑: 我想你也可以获得一个功能齐全的演示。


编辑: 此外,它们还提供SQL Refactor,它可以进行“智能”重命名。得分!

答案 2 :(得分:1)

你是否有一个名为SALES的虚拟数据库,它有一个名为[Orders]的VIEW:

CREATE VIEW Sales.dbo.Orders
AS
SELECT OrderId, OrderDate, ...
FROM CombinedDatabase.Sales.Orders

然后

SELECT ... FROM Sales.dbo.Order

仍然有效。

如果没有更多的jiggery-pokery,你将无法插入/更新该表。

如果您可以使用这样的VIEWs日志,那么您可以使用它来修复调用它们的代码!但我想不出办法做到这一点;但是你可以依次禁用每个,运行一些测试,修复任何被破坏的东西,然后转到下一个...然后通过重构来消除它们,但在这个过程中有一个很大的工作应用程序。

我已经将SED用于此类事情,但我们的所有表和所有列都有唯一的名称,我们在应用程序中使用与数据库列名匹配的变量名称 - 所以我很有信心在我们的应用程序中将xxx_yyy_ID更改为aaa_bbb_ID可以很好地工作,并且没有意外的副作用。

如果您有实际的列/表名称,如“销售”和“订单”,我认为像SED这样的东西会有风险

答案 3 :(得分:1)

好的,所以我对你的问题的基本理解是这样的:

  1. 您有三个不同的数据库(即Sales,Manu,Inventory)
  2. 他们有独特的桌子和过程名称(Manu或库存中的Sales中没有表/ proc名称)
  3. 您希望所有三个数据库中的所有表/ proc都在一个数据库中(即SaleManInv)
  4. 每个数据库中的某些存储过程显式引用其他数据库中的表(即Sales.dbo.lookupItem()显式引用Inventory.dbo.Items表)
  5. 导出和导入表似乎不会是一个问题,我会为procs做什么:

    1. 将一个proc从SQL Server 2000 db导出到SQL Server 2005 DB,以确定是否需要删除“.dbo”。交叉引用的一部分。
    2. 将所有过程导出到文本文件(所有过程的相同文件夹)
    3. 使用带有“在文件中搜索和替换”的文本编辑器(我使用PSPAD)并替换所有“Sales.dbo”。用“SaleManInv.dbo。”,然后是所有的“Iventory.dbo”。使用“SameManInv.dbo”。等将所有引用转换为新的数据库。
    4. 然后将导出和修改的过程运行到新的数据库中。
    5. 这有什么意义吗? : - )

答案 4 :(得分:1)

我处于类似的位置,我将几个SQL Server 2008数据库合并到1中。我的解决方案是将Integration Services的“传输服务器对象”任务用于新的目标数据库。所有数据都与表一起复制。之后 - 在一个非常复杂的查询中,我编写了所有存储过程/函数/视图/等。到一个文件并更改了所有跨数据库引用并重新创建了存储过程和其他对象。

存储过程的技巧是按顺序或syscontraints编写脚本,以确保最后创建内部引用其他存储过程/函数的存储过程或函数。

如果有一种我认为可以自动处理此任务的工具,我会立即购买。

答案 5 :(得分:0)

我想知道它是否是同一类数据。无论如何。我将创建一个名为“SourceSystem”的新列。所以当老板跑来跑去时:

“ - 2004年databaseystem1和db2之间的销售差异是什么”。

然后你可以回答这个问题。然后在一两年内,如果那些问题没有弹出。您可以删除该列。合并数据会删除数据的来源。