在更新项目中,我必须执行以下操作:
将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。
答案 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)
好的,所以我对你的问题的基本理解是这样的:
导出和导入表似乎不会是一个问题,我会为procs做什么:
这有什么意义吗? : - )
答案 4 :(得分:1)
我处于类似的位置,我将几个SQL Server 2008数据库合并到1中。我的解决方案是将Integration Services的“传输服务器对象”任务用于新的目标数据库。所有数据都与表一起复制。之后 - 在一个非常复杂的查询中,我编写了所有存储过程/函数/视图/等。到一个文件并更改了所有跨数据库引用并重新创建了存储过程和其他对象。
存储过程的技巧是按顺序或syscontraints编写脚本,以确保最后创建内部引用其他存储过程/函数的存储过程或函数。
如果有一种我认为可以自动处理此任务的工具,我会立即购买。
答案 5 :(得分:0)
我想知道它是否是同一类数据。无论如何。我将创建一个名为“SourceSystem”的新列。所以当老板跑来跑去时:
“ - 2004年databaseystem1和db2之间的销售差异是什么”。
然后你可以回答这个问题。然后在一两年内,如果那些问题没有弹出。您可以删除该列。合并数据会删除数据的来源。