2013-08-29 145 views
1

我繼承在MS SQL2008 R2大遺留系統引用遠程MS SQL數據庫。從存儲過程

有大量引用另一個數據庫的存儲過程:

select * from MySeparateDatabase_LIVE.dbo.MyTable 
select * from MySeparateDatabase_STAGING.dbo.MyTable 
select * from MySeparateDatabase_TEST.dbo.MyTable 

不幸的是所有的活,分期和測試數據庫在同一SQL實例和公司的限制意味着這不會很快改變。

問題來試圖從測試更改推送到分期和生活。它需要大量的手動編輯或查找/替換 - 這會在關鍵系統上引入潛在的錯誤。

我可以採用什麼技術來使用完全相同的SP在每個數據庫上?

+0

你能提供一個更好的片的示例代碼。沒有理由你的示例代碼不會在每個數據庫上執行。 – gvee

+0

@ gvee第一個查詢位於名爲dbLive的數據庫中,第二個查詢位於名爲dbStage的數據庫中。每個數據庫都應該引用其「伴隨」數據庫,但是爲了這樣做,當代碼從測試數據庫移動到臨時數據庫時,代碼當前必須更改。 –

+0

如果您正在使用存儲過程,則可以將MySeparateDatabase_XXX部分作爲參數傳遞。這會將你的問題轉移到你的SP被調用的部分,所以這可能是也可能不是解決方案。 – Sam

回答

5

Create SYNONYMs,例如在您的測試分貝:

CREATE SYNONYM dbo.MyTable FOR MySeparateDatabase_Test.dbo.MyTable; 

而在分期:

CREATE SYNONYM dbo.MyTable FOR MySeparateDatabase_Staging.dbo.MyTable; 

這提供了一個抽象層,並允許你在每個數據庫相同的代碼。通過這種方式,您可以一次部署不同的同義詞,但這些過程可能是相同的(並且它們只會引用dbo.MyTable而不帶數據庫前綴,讓同義詞重定向到正確的數據庫)。在測試分貝存儲過程將參考表中的其他測試數據庫,在暫存分貝一個存儲過程將引用其他臨時數據庫表等

+0

更好的是,自動生成它們,這就是我的做法。 – RBarryYoung

+0

@RBarryYoung你能否詳細說明一下? –

+0

我有我打電話傳遞一個數據庫名稱,將放棄所有的同義詞在當前數據庫的某個架構的程序,創建使用一個名稱列表表或所有表的名稱在同一個模式新異名在'DBO '作爲指南命名數據庫的模式。使切換階段和/或部署到生產變得非常容易。 – RBarryYoung