2016-05-20 47 views
-2

假設我有兩個名爲DB1和DB2的數據庫。在DB1中,有一個名爲Student的表,在DB2中,有一個名爲SP1的存儲過程。在SP1中,我使用以下查詢選擇學生表的數據:如何將DB1的請求重定向到DB2

從DB1.dbo.Student中選擇*。

我有300多個存儲過程具有上述的跨數據庫通信。現在,我想從數據和模式角度將數據庫從DB1更改爲與DB1相同的DB3。 爲此,我還必須修改具有完全限定數據庫名稱的所有300個存儲過程。現在,查詢將可能如下:

SELECT * FROM DB3.dbo.Student

我不想改變所有的存儲過程,現在來點DB3,也不想改變我在存儲過程中編寫的查詢動態SQL(我知道這可以通過創建動態SQL來完成)。

如果我們運行DB1.dbo.Student,它可能會重定向到DB3.dbo.Student。任何中間層或任何SQL設置。

這對我來說是非常大的幫助。提前致謝 !!

回答

0

我只需使用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 
+0

感謝您的回答愛德蒙..我不想再做硬代碼。我需要一些方法來調用DB3而不更改我的存儲過程。 – MehraG

+0

不幸的是,我知道傳遞數據庫作爲參數的唯一方法是將所有的程序重寫爲動態sql,這將是一個更糟糕的維護噩夢。我仍然會推薦使用同義詞。雖然不是動態的,但您可以更新同義詞而不影響其他存儲過程或視圖。創建可以自動刪除並重新創建同義詞的代碼也更容易。我在原始答案中添加了一個示例。 –

0

它能夠更好地使用使用關鍵字

使用[數據庫名稱要訪問] 查詢和存儲過程要使用 GO

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

如果數據庫重命名的目的是遷移數據庫,那麼爲什麼不重命名數據庫本身?

例如說重命名DB1 DB1_old然後重命名DB3 DB1

+0

這看起來對我來說是最簡單的解決方案。 – TJB

相關問題