我有两个Sql Server 2008 R2数据库,名为MyDbOne
和MyDbTwo
。
我想将它们(所有表格和程序)合并到一个名为MyDb
的新数据库中。
假设它们之间的表和过程名称没有冲突。
问题是:有很多代码和过程使用数据库名称执行查询,包括在其中一个数据库中声明的过程中声明的过程。有以下查询:
select * from MyDbOne..SomeTable;
select * from MyDbTwo..AnotherTable;
表SomeTable
和AnotherTable
将存在于MyDb
数据库中。但我需要支持使用leagcy名称MyDbOne
和MyDbTwo
来查询它们。如果我要运行上面的查询,我希望它们实际上与:
select * from MyDb..SomeTable;
select * from MyDb..AnotherTable;
有办法吗?也许在新数据库上创建某种全局别名,将MyDbOne
和MyDbTwo
解析为MyDb
?那将是完美的,但我不知道该怎么做。
非常感谢!
答案 0 :(得分:0)
我不认为这有一个问题的解决方案。如果我是你,我会保留现有的MyDbOne
和MyDbTwo
数据库并创建一个全新的数据库,通过视图引用这两个表。基本上,您将创建一个位于这些现有数据库之上的Data Warehouse
。这个设置的好处是,你不必重写任何遗留代码,这是巨大的。
答案 1 :(得分:0)
没有简单的方法。您必须手动更新所有这些引用。您可以使用this answer中的一个查询在SQL服务器中搜索包含这些数据库名称的所有对象;
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%Foo%'
AND ROUTINE_TYPE='PROCEDURE'
SELECT OBJECT_NAME(id)
FROM SYSCOMMENTS
WHERE [text] LIKE '%Foo%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY OBJECT_NAME(id)
SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
AND definition LIKE '%Foo%'