Visual Studio 2010 Premium 企業版 的 資料庫開發 功能非常的強大,可提供完整資料庫的變更管理並進一步達到版本控管的目的,但在做 結構描述比較 (即資料庫結構比對) 時若使用預設的資料結構選項會有些小問題,主要是正式機資料庫與測試機資料庫因為環境不一致所造成的小差異會導致在做結構描述比較時讓目的資料庫發生異常,例如登入權限消失、資料庫無法存取、…等狀況,所以對於資料庫專案需要同時套用於多種不同資料庫環境時,就必須要能忽略一些資料庫結構比對的項目才能順利的操作。
舉個例子來說,我們公司內部的開發環境有共用的 SQL Server 2005 資料庫,客戶端也有壹個測試環境也有一台 SQL Server 2005 資料庫,還有正式機也有壹台 SQL Server 2005 資料庫,由於客戶的資料庫與正式機的資料庫都不是我們能管理的,所以針對伺服器層級的物件物件我們都沒有更新的權利,所以一定有些地方的資料庫設定一定不太一樣,而這些不一樣的地方就會造成每次進行 結構描述比較 時都會提示說要更新設定,如此一來我們就無法順利的完成所有資料庫的同步更新作業。
以我們遭遇的狀況來說明,我們的開發資料庫修改了一個 Table 欄位,然而我們要透過 資料庫專案 進行 結構描述比較,但是在比較的時候「預設」會比對所有安全性設定,包括 登入、資料庫使用者、資料庫角色、……等資料庫物件,由於我們並沒有「登入」的存取權限,因此在執行寫入更新的時候,就會發生執行到一半就發生失敗且無法 Rollback 的狀況,也就是說,他會先將客戶端資料庫不存在的 登入 帳號刪除(由於我們可以刪除的是自己的帳號與該帳號所屬的使用者),但刪除資料庫角色後卻無法重新指派新的角色與權限(因為權限不足),所以每次只要按下「寫入更新」後,我們的使用者權限就會被移除掉,然後要請對方的 DBA 重新設定權限,這過程實在不堪其擾!
另一種狀況是同步資料時的,由於 SQL 資料檔的路徑不同,因此每次在同步時也會導致要求更新 SQL 資料檔的位置,這點也是很麻煩。
所以我們要調整 Visual Studio 2010 中關於「資料庫工具」的選項設定,讓他預設跳過(忽略)一些資料庫物件類型的比對,還有一些比對時的比較選項,這樣一來我們在比對兩個資料庫時,就能專注在「資料庫本身」的相關物件,不牽涉到任何檔案實體路徑、使用者權限、物件權限等設定,如此一來我們就能安心的使用資料庫專案進行多台 SQL Server 資料庫的比較工作。
以下是我的設定筆記,可供開發團隊參考:
Visual Studio 2010 同時支援 Microsoft SQL Server 2005 與 Microsoft SQL Server 2008 資料庫系統,因此這兩段的設定是分別獨立的,所以以下設定必須分別設定 Microsoft SQL Server 2005 與 Microsoft SQL Server 2008 才行。
我們先設定 一般 (General) 頁籤的兩個設定,將以下兩個項目勾選:
- 忽略 ANSI_NULLS
- 忽略 QUOTED_IDENTIFIERS
- 忽略檔案和記錄檔的檔名和路徑
如果你用的是 Visual Studio 2010 繁體中文版,可參考下圖設定:
然後切換到 物件型別 (Object Types) 設定以下選項:
- 勾選 SQL 檔案 (SQL Files)
- 勾選 角色成員資格 (Role Memberships)
- 勾選 使用者 (Users)
- 勾選 登入 (Logins)
- 勾選 資料庫角色 (Database Roles)
- 勾選 檔案群組 (Filegroups)
- 取消勾選 擴充屬性 (Extended Properties)
- 勾選 權限 (Permissions)
由於我們經常會透過擴充屬性紀錄欄位的用途與詳細描述,但這一項預設是勾選的(勾選代表忽略),因此我建議要將這個選項取消勾選,這樣才會同步擴充屬性的資料進來。
如果你用的是 Visual Studio 2010 繁體中文版,可參考下圖設定:
有用到資料庫結構比較的人做了此設定就能較為安心的透過 Visual Studio 2010 的資料庫專案管理、同步多台不同環境下的 SQL Server 資料庫了。
當然,如果你另外建立一個 資料庫專案 且只針對正式環境的資料庫做版本控管也是個不錯的作法,這種情況下就建議保留所有物件型別,這樣才能照實的做好正式資料庫的資料庫伺服器物件與資料庫物件的版本控管,也等同於拿 資料庫專案 當成正式資料庫結構描述的完整備份!
心得分享
在手邊的開發工具還沒徹底瞭解之前,永遠沒有抱怨的空間,有時候我會聽到有人說某某工具不好用、常常出問題等等、操作步驟太複雜、…等等,但這樣的評斷到底是一種情緒性的抒發,還是理性分析後的判斷?也許身為開發人員永遠有更重要的事情要做,因此沒有時間熟悉工具,但不能因此當成抱怨工具不好用的藉口,畢竟專業的工具還是需要一些基礎知識的加持才能事半功倍、得心應手,各位只要試圖去瞭解工具所帶來的價值,就會願意花時間在上面,進而使用更適切的工具來解決問題。
雖然我們在多年前就已經在用資料庫專案類型,不過由於工具一直沒有非常熟悉他的來龍去脈,因此即便在公司內也沒有所有專案都採用這套來做資料庫管理與開發,現在回想起來還真有點可惜,因為透過資料庫專案的建立可以非常有效率的開發 SQL Server 資料庫專案,像是撰寫 View、Trigger、Stored Procedure 的時候都會有 Intellisense 可用 (包括 SQL Server 2005 資料庫),整個資料庫可以做出非常完整的部署管理,甚至還能對整個資料庫做完整的 靜態程式碼分析 (Static Code Analysis),這些功能所帶來的整體價值不言可喻,實在值得花時間學習與瞭解。
前陣子我終於有機會跟它混熟一點,所以對工具的陌生感大多消除殆盡了,也因為這樣才能更勇敢的使用資料庫專案工具來協助管理專案,有機會、有時間的話可以多寫一些操作上的注意事項與操作技巧。
2010/12/2 備註
感謝 Franma 提供消息,原來 Quest Software 公司已經開發出針對 Visual Studio 2010 Premium 專用的 Oracle Database Provider 可讓你在 Visual Studio 2010 中管理 Oracle 資料庫,此產品區分 免費版 與 商用版,商用版的功能非常完整且強大,幾乎跟 Visual Studio 2010 Premium 內建對 SQL Server 的支援度差不多,而 免費版 下載後可使用 180 天,之後需要重新下載並安裝新的免費版。
相關連結
Visual Studio 2010 選項設定檔下載
可直接透過 [工具] / [匯入和匯出設定] 功能,直接將設定匯入並設定完成