【问题标题】:How to redirect a request for DB1 to DB2如何将对 DB1 的请求重定向到 DB2
【发布时间】:2016-05-20 19:42:28
【问题描述】:

假设我有两个名为 DB1 和 DB2 的数据库。在 DB1 中有一个名为 Student 的表,在 DB2 中有一个名为 SP1 的存储过程。在 SP1 中,我正在使用以下查询选择学生表的数据:

从 DB1.dbo.Student 中选择 *。

我有超过 300 个具有上述跨数据库通信的存储过程。现在,我想将我的数据库从 DB1 更改为从数据和模式角度来看与 DB1 相同的 DB3。 为此,我还必须修改所有 300 个具有完全限定数据库名称的存储过程。现在,查询可能如下所示:

从 DB3.dbo.Student 中选择 *

我现在不想将所有存储过程都更改为指向 DB3,也不想将我在存储过程中编写的查询更改为动态 SQL(我知道这可以通过创建动态 SQL 来完成)。

如果我们运行 DB1.dbo.Student 是否有可能,它会重定向到 DB3.dbo.Student。任何中间层或任何 SQL 设置。

这对我有很大的帮助。提前致谢!!

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2005


    【解决方案1】:

    如果您的数据库重命名的目的是迁移数据库,那么为什么不自己重命名数据库呢?

    例如说将 DB1 重命名为 DB1_old,然后将 DB3 重命名为 DB1

    【讨论】:

    • 这对我来说是最简单的解决方案。
    【解决方案2】:

    我会简单地使用 SQL Server 脚本生成器工具编写所有存储过程的脚本。然后在脚本上进行查找替换,找到文本“DB1.dbo。”并替换为“DB3.dbo”。

    将来您可能想要考虑使用同义词来引用外部表,那么您只需更新同义词而不是所有过程。请参阅以下有关同义词的 MSDN 文章:

    https://msdn.microsoft.com/en-us/library/ms187552.aspx

    同义词使用示例:

        USE [DB1]
        GO
    
        -- Create a synonym for table A located in DB2.
        CREATE SYNONYM [dbo].[External_TableA] FOR [DB2].[dbo].[TableA]
        GO
    
        -- Synonym is pointing to TableA in DB2 , select statement will return data from DB2 tabla A.
        SELECT  *
        FROM    [External_TableA]
    
        GO
    
        -- Point the Synonym to same table but on DB3
        DROP SYNONYM [dbo].[External_TableA]
        CREATE SYNONYM [dbo].[External_TableA] FOR [DB3].[dbo].[TableA]
    
        GO
    
        -- No update was needed on views or stored procedure.
        -- Synonym is pointing to TableA in DB3 , select statement will return data from DB3 tabla A.
        SELECT  *
        FROM    [External_TableA]
    

    以下查询将生成所需的 DROP 和 CREATE 脚本,以将您的同义词从旧数据库重新映射到新数据库。

        DECLARE @oldDB NVARCHAR(100) = 'DB2';
        DECLARE @newDB NVARCHAR(100) = 'DB3';
    
        SELECT   'DROP SYNONYM [dbo].[' + name + ']' AS [Drop Script]
                ,'CREATE SYNONYM [dbo].[' + name + '] FOR ' + REPLACE(base_object_name, @oldDB, @newDB) AS CreateScript
        FROM    sys.synonyms 
        ORDER BY name
    

    【讨论】:

    • 感谢您的回答 Edmond.. 我不想再做硬编码了。我需要一些方法来调用 DB3 而无需更改我的存储过程。
    • 可悲的是,我知道将数据库作为参数传递的唯一方法是将所有过程重写为动态 sql,这将是更糟糕的维护噩梦。我仍然建议使用同义词。虽然不是动态的,但您可以更新同义词而不影响其余的存储过程或视图。创建可以自动删除和重新创建同义词的代码也容易得多。我在原始答案中添加了一个示例。
    【解决方案3】:

    最好使用 USE 关键字

    使用[您要访问的数据库名称] 您要使用的查询和存储过程 去吧

    例如

    use [db1]
    select *from yourTableName
    exec yourStoredProcedure parm1,parm2,....
    Go
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      相关资源
      最近更新 更多