Sql-Server

一種無需硬編碼其名稱即可引用其他數據庫的方法

  • March 29, 2018

我的客戶使用一對數據庫(SQL Server),其中一個引用另一個。讓我們說DataDbConfigDbConfigDb包含數百個引用的 SP,DataDb例如[DataDb].[dbo].[the_object].

這對數據庫與一些應用程序一起部署給他們的客戶。

對於開發和測試,我需要同時為多個客戶提供本地配對,並通過更改連接字元串來針對正確的配對執行應用程序。

當我恢復客戶的數據庫時,我使用客戶的後綴,例如DataDb_Cust1, ConfigDb_Cust1。問題是來自 ConfigDb 的儲存過程已經硬編碼了引用數據庫的名稱([DataDb].[dbo].[the_object]我總是需要將其更改為[DataDb_Cust1].[dbo].[the_object])。

我可以遍歷所有對象(SP、函式、視圖)並重命名引用的數據庫名稱。我已經有一些腳本來自動化它。但是有沒有更好的方法(例如,只使用在 SQL 伺服器級別定義的一些別名或類似的東西),這樣引用的數據庫名稱就不必在 SP 中硬編碼?

我查看了同義詞,但事實證明它們不受 Microsoft Entity Framework - 應用程序使用的 ORM 的支持。我需要一個適用於 EF6 的解決方案。不過我可以自己驗證。還有其他解決方案嗎?

DB 的大小各不相同,但通常 DataDb 在 1 到 8GB 之間,ConfigDb 非常小。沒有企業功能,但它使用 SQLCLR 程序集,對於一些客戶甚至連結伺服器以訪問分佈式事務中的其他數據庫(使用 MSDTC),但這種情況很少見。我現在有 6 套,預計在不久的將來最多 20 套。

DataDb 使用FILESTREAM,LocalDb 不支持。

如果數據庫小於 10 GB,那麼使用 SQL Server Express Edition 並為每個客戶創建一個單獨的實例可能會更容易。這將允許配對數據庫之間完全分離(更準確的測試環境),並且意味著您不需要更改任何數據庫名稱。如果應用程序和 SQL Server 在同一台伺服器上進行開發和測試,那麼您可能會使用 SQL Server Express LocalDB(也就是“LocalDB”),它可以快速輕鬆地創建新實例並啟動和停止它們. 但是 LocalDB 不允許 TCP/IP 連接或任何遠端連接;它只是本地的。

即使您需要標準版或企業版功能,為每個客戶創建一個實例可能仍然比修改對像以引用不同的數據庫名稱更容易,尤其是因為任何修改都會引入錯誤更改某些內容然後破壞您所擁有的東西的風險’甚至沒有工作。

而且,如果您有一個標準的命名約定,例如DEV_{customer_code},那麼編寫一個命令外殼腳本(.cmd 文件)來啟動和停止實例將相當容易,只需傳入{customer_code},然後您就可以創建桌面短-cuts 和/或通過自動化測試呼叫腳本等。

不要忘記,SQL Server 2016 Developer Edition 現在是免費的。您不需要 Enterprise 功能,但您無法超越這個價格 :-)。

如果您必須將所有數據庫保存在一台伺服器上,那麼您可以執行動態 SQL 來確定數據庫的名稱。這是一個遍歷伺服器上所有數據庫的程式碼範例。

前任:

DECLARE @DB_Name varchar(100) 
DECLARE @Command nvarchar(1000)
DECLARE database_cursor CURSOR FOR 
SELECT name FROM MASTER.sys.sysdatabases 
OPEN database_cursor

FETCH NEXT FROM database_cursor INTO @DB_Name

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT @Command = 'USE [' +  @DB_Name + ']; SELECT * FROM ' + @DB_Name+'.[dbo].[the_object] '
    EXEC sp_executesql @Command

    FETCH NEXT FROM database_cursor INTO @DB_Name 
END

CLOSE database_cursor 
DEALLOCATE database_cursor

引用自:https://dba.stackexchange.com/questions/179575