2013-11-10 31 views
0

如果我在Database1上創建了存儲過程。並且該查詢正在訪問Database2。
生產環境沒有相同的開發環境的數據庫名稱。
現在我必須檢查每個過程才能將Database2更改爲Database_Prod2。如何訪問不同的數據庫,而無需在查詢中編寫數據庫名稱

這很容易出錯。我如何避免在查詢中使用數據庫名稱。或者我如何避免這種部署問題,因爲數據庫名稱必須不同?

SELECT * 
FROM [dbo].[MyTable] tab1 
INNER JOIN [DB2].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID 

應改爲

SELECT * 
FROM [dbo].[MyTable] tab1 
INNER JOIN [DB_Prod2].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID 
+0

這取決於你如何部署存儲過程,但你可以使用腳本變量來指定不同的數據庫,表名稱等:http://technet.microsoft.com/en-us/library/ms188714.aspx – Jordan

回答

0

使用動態語句:

CREATE PROC (@DBName varchar(100) 
    --other params 
) 
AS 
BEGIN 
DECLARE @SQL VARCHAR(MAX) ='' 
SET @SQL = 
' 
SELECT * 
FROM [dbo].[MyTable] tab1 
INNER JOIN ['[email protected]+'].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID 
' 
EXEC(@SQL) 
END 
1

有這個問題,你可以使用,這取決於預算/複雜許多解決方案。這些是我的最愛: -

  1. 在虛擬環境中複製您的實時環境,並針對「安全」副本進行編碼。
  2. 使用視圖來隔離你的表與你的邏輯。這些視圖可以非常容易地從信息模式創建,因此它們與基礎表具有相同的結構。然後,您可以將目標視爲您想要的任何「活動」數據庫。
  3. 爲所有模式對象創建同義詞,並且只對它們進行編碼。在部署解決方案時切換同義詞的目標。 reference

複製您的環境是最靈活的解決方案 - 但它也是最複雜和最昂貴的。它使您有機會將您的開發人員與實時系統(認證?)和數據完全隔離。以可重複和可測試的方式打包部署的規範也是非常理想的。

使用視圖和同義詞是一個簡單的/更便宜的解決方案 - 但需要更多的紀律和代碼審查等

相關問題