如何将DB1的请求重定向到DB2

时间:2016-05-20 19:42:28

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

假设我有两个名为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设置。

对我来说这将是非常大的帮助。在此先感谢!!

3 个答案:

答案 0 :(得分:1)

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

e.g。说将DB1重命名为DB1_old,然后将DB3重命名为DB1

答案 1 :(得分:0)

我只需使用SQL Server脚本生成器工具编写所有存储过程的脚本。然后在脚本上找到替换并找到文本'DB1.dbo。'并替换为'DB3.dbo。'

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

https://api.us.onelogin.com/auth/oauth2/token

使用同义词的示例:

    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

答案 2 :(得分:0)

最好使用USE关键字

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

例如

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