在 Visual Studio 下建立資料庫專案是資料庫版控的一種好方式,但是一個資料庫專案只能針對一個資料庫做處理,如果遇到需要跨資料庫處理的時候該如何來做處理會比較方便 ?
這個周末收到一個社群的朋友的問題,如果想要使用 Visual Studio 建立「資料庫專案」來進行正式區資料庫結構的版本控制,如果遇到有需要跨資料庫存取該怎麼來處理 ?
因為從 2012 年開始,我使用資料庫專案幾乎都是搭配 Azure SQL Database,因為 Azure SQL Database 在做這類跨資料庫存取的時候,都是採用 External Table 來進行,也就沒有特別去注意跨資料庫存取的設定,所以當朋友詢問的時候一時之間還真的忘記之前是怎麼處理,因此就想說整理一下處理過程,免得自己又忘記了。
為了這個測試,我先建立一個簡單的資料庫專案,裡面有建立一個 Students 的資料庫來當成範例,建立好之後也可以順利將這個專案發佈到我的 DEMO1 的資料庫

此時為了要呈現跨資料庫的存取,我也建立一個 DEMO2 的資料庫,並且在這個資料庫內先建立一個 Employees 的資料表

這個時候我們就可以回到我們的資料庫專案內,我嘗試建立一個名為 v_Employees 的 View,定義要去存取 DEMO2 資料庫下面的 Employees 資料表

但是當我們要 Build 這個資料庫專案的時候,就會出現有 SQL 71561 的「錯誤訊息」。這個就比較麻煩一點,因為如果是警告還可以設定忽略這個警告訊息,但是要是判定為錯誤,那就只能先解決這些問題才能進行 Build。

在網路上如果查看這個訊息 , 有些文章或建議,會要您去建置的地方設定隱藏那個警告訊息就可以避免,但如果前面所寫的,因為這個對 Build 過程會視為「錯誤」,這個設定只能忽略警告訊息,所以是沒有用的。

解決方法其實很簡單,就是讓 Build 的時候可以認得 DEMO2 裡面有哪些物件,因此我們可以在同一個方案裡面,去建立 DEMO2 的資料庫專案,您不一定要把整個資料庫都匯入,可以只要建立有你在原本資料庫專案內會去關聯的物件就可以了。

此時我們就可以在 DEMO1 的資料庫專案內,從「參考」→「加入資料庫參考」的選項

此時將 DEMO2 加入參考,並且指定成為一個「變數」,讓 Build 的時候可以讓 DEMO1 資料庫專案可以認得 DEMO2 的相關物件

正常來說透過上述的設定就可以關聯到 DEMO2 的資料庫內所需要使用的物件,但是我個人的習慣通常都會搭配用「同義字 ( Synonym )」來做處理,因為後續要變動就會比較有彈性一點。所以這裡我建立一個名稱是 s_Employees 的同義字,讓他對應到 DEMO2 資料庫的 Employees 的資料庫,這裡要注意不能直接寫 DEMO2,要比照在上個步驟所設定的變數,因此這裡我們要設定關聯到 [$(DEMO2)].[dbo].[Employees] 的物件,前一個和這裡的設定是最主要的關鍵點。

因此這裡回到一開始我們所想要建立的 View ,就可以很容易來做設定了

因此當我們要發行該專案的時候,因為有使用到變數,所以發行的時候就要多指定 $(DEMO2) 這個變數真正的名稱,設定好之後就可以按下「發行」的按鈕了

執行後我們可以看到 Visual Studio 內已經顯示順利發行成功

此時回到我們的資料庫中,我們就可以看到資料庫專案中所建立的物件都順利的發佈到資料庫內了

透過上述設定資料庫參考以及同義字的使用,就可以讓我們在資料庫專案上使用的更為便利了。