[SQL Server] 程式都已正式上線,由測試機DB更新至正式機DB的小技巧
前言
昨天從某高手學來的技巧,覺得還滿有用,立馬記下來才不會忘記XD
想必很常碰到這種情況,程式都已經開發完已上線,客戶又忽然追加需求導致資料庫某幾個Table要加欄位、刪欄位、加Foreign Key等等…
我以前都傻傻的,請客戶那邊的工程師加(或刪除)欄位,或自己去正式環境DB一個一個欄位慢慢處理
其實透過Visual Studio的資料庫專案搭配TFS版控可以產生測試機DB和正式機DB的差異SQL語法,傳給客戶或自己去正式環境透過SSMS管理介面執行該差異SQL語法就好了
實作
Demo環境:Visual Studio 2012 、SQL Server 2012
1.前置作業 - 建立資料庫版控
測試機DB我的Table如下
然後打開Visual Studio加入資料庫專案(Visual Stuido 2010好像要另外裝SSDT(SQL Server Data Tools) ,Visual Studio 2012則已內建SSDT)
如果沒出現資料庫專案的話,就去下載安裝一下SSDT:http://msdn.microsoft.com/zh-TW/jj650015
新增完資料庫專案後,再依正式環境選擇目標平台的SQL Server版本
現在資料庫專案空空如也,要再做結構描述比較,準備把測試機DB的Schema匯入至資料庫專案
從左上方下拉選單選取比較來源
選擇比較來源為測試機資料庫
如果是第一次做的話,就按新增連接,第二次以後做的話可以直接從「選擇資料庫」下拉選單中選取資料庫
↓這是新增連接的畫面,我就選我的測試機資料庫
接著按確定
再來選取比較目標
要比較的目標當然就是資料庫專案囉
↑按下確定後
再來要按下比較按鈕前
額外提一下我的選項設定習慣:如果Schema變更造成資料遺失的話仍然強制執行還有要略過比較DB使用者,避免把測試機DB的使用者覆蓋掉比較目標使用者(因為通常測試機DB和正式機DB的登入使用者是不一樣的)
※以上對話框容小弟吐槽一下,我的環境跟設定明明都沒有SQL Server 2014為啥標題會是SQL Server 2014的結構描述比較選項XD?
選項設定完後可以按比較按鈕,之後會出現以下畫面,由於是第一次做比較,所以都是加入資料表的動作,確認無誤後按更新鈕,把測試機資料庫Schema匯入至資料庫專案
更新完成後,就可以把目前視窗關閉,SqlSchemaCompare檔可以不用儲存沒關係
接下來把資料庫專案納入版控,版控這部份就不累述了,各公司應該都有做吧(?
2. 產生最新版本.dacpac和過去版本的.dacpac檔
※本Demo使用Visual Studio Online(原名Team Foundation Service)做版控
假設現在客戶提出要求,每個產品都要有新增時間好讓人知道該產品是什麼時候匯入系統
所以測試機DB欄位異動如下,另一開始Products表我故意少建一個產品類別的FK,以下也補上去了
測試機DB欄位追加完後,資料庫專案也要跟著更新Schema並簽入專案版控
更新Schema方法跟上述的比較方法完全一樣
可以看到資料庫專案的Products待會要新增一個欄位和Foreign Key
然後按下更新
更新完後,整個資料庫方案要做簽入動作
剛剛簽入後,現在資料庫專案是最新版本也是客戶要的版本
先重建一下整個資料庫專案,目的要取得.dacpac檔(這是一個資料庫Schema檔案)
接著再到資料庫專案的Bin目錄裡找到.dacpac把它隨便複製到一個地方
回到Visual Studio到原始檔控制總管
檢視記錄,準備取得之前的版本(就是上正式環境DB的那一版本)
同樣地重建整個資料庫專案,然後把.dacpac檔隨便放到一個地方
3. 比較兩個版本.dacpac,產生差異SQL語法
前面講很多,現在開始才是本文章的重頭戲XD
到Visual Studio的資料庫專案
然後這份差異SQL語法有幾個地方要小修正一下
視窗捲軸拉至底下
↓正式機DB執行情況
最後提醒Visual Studio方案記得取得最新版本,讓資料庫專案和目前測試機DB的Schema一樣
結語
本文章看起來雖然落落長,但如果平常就有做好資料庫版控的話
在程式正式上線後,面對客戶的需求變更,其實只要一下子就可以產好SQL差異語法讓客戶的工程師(或自己)去正式環境更新DB
※2015.01.09追記
我自己在選取來源和目標時,有時候也搞混哪個要選哪個
所以自己想出一個口訣:新來源更新至舊目標