Sql-Server

SQL Visual Studio 在發布配置文件中查找和替換

  • October 30, 2018

我們在 Visual Studio 數據庫項目 (SSDT) 中有原始碼控制。為了進行跨數據庫引用,我們在下面的項目引用中使用了類似的內容。

我們需要項目引用,因為其他數據庫可以在我們公司的兩個選項之間進行選擇。大多數時候,它的 90% 數據庫 A 和 10% 數據庫 B。

這讓開發者很頭疼,用$和括號寫程式碼

$$ $$. 有什麼解決方法嗎?例如,假設我在 DatabaseA 預設中編寫程式碼,

from [$(OtherDatabase)].dbo.PurchaseOrder
from DatabaseA.dbo.PurchaseOrder

有沒有辦法擁有多個發布配置文件腳本,我可以編寫一個發布配置文件腳本來查找對數據庫 A 的所有引用,並用數據庫 B 替換嗎?也許就像一個簡單的 Ctrl-查找和替換?如何將這種命令、批處理文件、儲存過程或 Powershell 合併到發布配置文件中?

尋找有效途徑;我可以在下面使用這個答案,但是 DatabaseA 需要駐留在同一台伺服器中,然後我會刪除並重新創建可能不是最佳的。

在視圖和儲存過程中查找和替換數據庫名稱

意識到試圖避開這條路線的同義詞,並進行查找/替換

在編寫跨數據庫程式碼時,我更喜歡避免三部分名稱引用。您所描述的可變性$(OtherDatabase)是我避免使用三部分名稱的確切原因。總有一天,DatabaseA將被重命名為DatabaseC並且不得不更新程式碼中的一堆引用。就您而言,您可以進行新建構,但這仍然很痛苦。

相反,在項目中為每個跨數據庫引用創建同義詞。在同義詞中,您將對每個對象使用一次 SSDT 項目引用變數:

CREATE SYNONYM dbo.PurchaseOrder FOR [$(OtherDatabase)].dbo.PurchaseOrder;

然後,每次引用跨數據庫對象時,只需要使用兩部分名稱即可。開發人員不應使用 the[$(OtherDatabase)]或占位符DatabaseA引用進行查找和替換。

FROM dbo.PurchaseOrder

這有一個額外的好處,即所有程式碼在數據庫的不同迭代中總是相同的。唯一不匹配的對像類型將是同義詞。無需檢查程式碼,您只需查詢sys.synonymsDMV 即可確定dbo.PurchaseOrder點在哪裡。

在此查詢中,name將返回由兩部分組成的名稱 (ex PurchaseOrder),base_object_name並將返回由三部分組成的名稱 (ex DatabaseA.dbo.PurchaseOrder):

SELECT name, base_object_name FROM sys.synonyms;

如果您有一個需要從 DatabaseA 重新指向 DatabaseB 的數據庫,您可以簡單地通過一系列DROP SYNONYM&CREATE SYNONYM語句重新指向同義詞,而無需ALTER執行過程/視圖/函式/觸發器的語句。

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