【问题标题】:SQL Server - rename and merge databases with legacy supportSQL Server - 使用旧支持重命名和合并数据库
【发布时间】:2015-04-05 20:22:25
【问题描述】:

我有两个 Sql Server 2008 R2 数据库,分别称为 MyDbOneMyDbTwo

我想将它们(所有表和过程)合并到一个名为 MyDb 的新数据库中。

假设它们之间的表名和过程名没有冲突。

问题是:有很多代码和过程使用数据库名称执行查询,包括在其中一个数据库中声明的从另一个数据库引用表的过程。有这样的查询:

select * from MyDbOne..SomeTable;
select * from MyDbTwo..AnotherTable;

SomeTableAnotherTable 表随后将存在于 MyDb 数据库中。但我需要支持使用旧名称MyDbOneMyDbTwo 来查询它们。如果我要运行上面的查询,我希望它们实际上与:

select * from MyDb..SomeTable;
select * from MyDb..AnotherTable;

有什么办法吗?也许在新数据库上创建某种全局别名,将MyDbOneMyDbTwo 解析为MyDb?那会很完美,但我不知道该怎么做。

非常感谢!

【问题讨论】:

    标签: sql merge sql-server-2008-r2 alias


    【解决方案1】:

    我认为对此没有问题的解决方案。如果我是你,我会保持现有的 MyDbOneMyDbTwo 数据库完好无损,并创建一个全新的数据库,通过视图引用这两个表。基本上,您将创建一个位于这些现有数据库之上的Data Warehouse。这种设置的好处是,您不必重写任何遗留代码,这是巨大的。

    【讨论】:

      【解决方案2】:

      没有简单的方法解决它。您必须手动更新所有这些引用。您可以使用来自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%'
      

      【讨论】:

        猜你喜欢
        • 2016-01-11
        • 1970-01-01
        • 2012-09-11
        • 2015-11-21
        • 2012-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        相关资源
        最近更新 更多