使用 Visual Studio 2013 資料庫專案發佈資料庫

說明

當您使用 Visual Studio 2013 資料庫專案發佈資料庫時,可能會有建立第二個以上的檔案群組,或是將預設檔案群組由 PRIMARY 改為自訂檔案群組,及指定資料庫檔案 / 交易記錄檔初始大小、自動成長和大小上限等需求。

本文將介紹使用資料庫專案的一些小技巧,希望透過文中的介紹,讓您在發佈資料庫專案時能夠更加順利。

學習目標

依照本文的步驟,您將可了解使用 Visual Studio 2013 達到下列目的的步驟該如何進行。

  1. 建立資料庫專案

  2. 建立檔案群組並指定預設檔案群組

  3. 建立資料庫檔案並指定初始大小和自動成長 / 大小上限

  4. 建立交易記錄檔並指定初始大小和自動成長 / 大小上限

  5. 發佈資料庫專案

建立資料庫專案

首先在 Visual Studio 2013 新增專案,選擇【Templates > SQL Server > SQL Server Database Project】,輸入專案名稱及選擇專案路徑後按 OK。


資料庫專案建立完成後,會在 SQL Server Express LocalDB 自動執行個體 Projects 建立一個相對應的使用者資料庫,所有資料庫專案中的操作都會透過這個資料庫做語法及物件的檢查,在真正發佈前您可以盡量在這裡做測試,以確保資料庫設計的品質。

開始建立資料庫物件前,建議先針對資料庫設定做調整,請在 Solution Explorer 視窗中於資料庫專案名稱上按滑鼠右鍵選擇 Properties,開啟資料庫專案屬性視窗。

接著確認 Project Settings 頁籤中 Target platform 是否和將來要發佈的 SQL Server 版本一致。另外,若需要指定預設結構描述,也可以在 Default Schema 欄位中指定。

其他資料庫細部設定,可以點選上圖的 Database Settings 來做設定,舉凡資料庫定序、復原模式以及相容性層級等,都可以在發佈前先在資料庫專案中定義好,到時候直接發佈即可。

其中 Default filegroup 的部分,預設只有 PRIMARY 檔案群組可供選擇,若要將預設檔案群組改為自己的檔案群組,請見下一節有關【建立檔案群組】的說明。

簡單來講,當您建立資料庫專案之後,最好養成習慣將資料庫相關設定都先調整好,包含目的伺服器的版本以及資料庫屬性等,再開始後續建立資料庫物件。

建立檔案群組並指定預設檔案群組

前一節我們提到若想要將預設檔案群組改為 PRIMARY 以外的檔案群組,則必須先建立檔案群組的項目,筆者根據資料庫專案相關的項目分類規則,事先在資料庫專案上建立 Storage 資料夾,接著於 Storage 資料夾中按滑鼠右鍵選擇 New Item,在 Add New Item視 窗選擇【SQL Server > Storage > Filegroup】輸入檔案群組名稱,然後按 Add 來加入檔案群組。


此時,Visual Studio 2013 會自動產生加入檔案群組所需的 T-SQL 指令碼,其中資料庫名稱以變數呈現($(DatabaseName)),請勿修改這個名稱以確保發佈時自動套用您所指定的資料庫名稱。


此時回到 Database Settings 視窗就可以在 Operational 頁籤中選擇前一步驟所建立的檔案群組。

建立資料庫檔案並指定初始大小和自動成長/大小上限

若您需要在資料庫專案建立交易記錄檔,則必須先建立資料庫主檔案(mdf),否則在產生發佈指令碼時,會出現只有定義交易記錄檔而沒有資料庫檔案的狀況,進而導致失敗。反之,如果您無須在資料庫專案中建立交易記錄檔,則可直接建立所需的次要檔案(ndf)。


下圖為在資料庫專案中建立交易記錄檔而沒有建立資料庫檔案所產生的發佈指定碼,熟悉 CREATE DATABASE 敘述的朋友,一看就會知道下圖紅色框框處的語法是錯誤的,若直接發佈一定會失敗。


Visual Studio 2013 產生的資料庫檔案指令碼只會以 ndf 為名稱,您可以自行修改為 mdf。

若不以 TO FILEGROUP 敘述指定資料庫檔案的檔案群組,預設會放在 PRIMARY。


重複前面的步驟繼續建立資料庫次要檔案並指定使用前一節所建立的 SECONDARY 檔案群組。


若想要指定資料庫檔案的初始大小、自動成長及大小上限,則可以自行加入下列紅色框框處的指令碼。

建立交易記錄檔並指定初始大小和自動成長/大小上限

使用資料庫專案來建立交易記錄檔的方式也很簡單,請在 Add New Item 視窗中點選【SQL Server > Storage > Log File】,輸入交易記錄檔名稱後按 Add。


同樣的您可以修改交易記錄檔的相關檔案屬性,像是初始大小及自動成長等。


若您依照筆者的步驟進行測試,此時在 Solution Explorer 中應該會看到下列結果。

接著就可以開始把資料庫專案發佈到 SQL Server。

發佈資料庫專案

發佈資料庫專案有兩種方法,一種是在 Solution Explorer 中資料庫專案名稱上按滑鼠右鍵選擇 Publish。

或是在功能表選擇【BUILD > Publish 資料庫專案名稱】。


不論使用上面哪種方式發佈,都會出現下圖的Publish Database視窗來讓您指定目標資料庫的連線字串(Target database connection),以及發佈的資料庫名稱(Database name)及發行指令碼檔案名稱(Publish script name)等資訊,您可以按 Create Profile 來儲存連線字串及發佈設定,之後再發佈時透過 Load Profile 來直接套用先前的設定,儲存的 Profile 會放在專案路徑下,其名稱為【資料庫專案名稱 .publish.xml】。

最後可以選擇 Generate Script 來產生發佈指令碼以手動發佈資料庫,或直接按 Publish 發佈資料庫。

【警告:建議在正式環境中應避免直接發佈,以免造成資料遺失】

實際發佈之後您會發現前面所設定的資料庫檔案或交易記錄檔初始大小及自動成長等設定都沒生效,Visual Studio 2013 還是以預設資料庫大小及自動成長設定來建立資料庫。


問題在於發佈資料庫前必須手動修改一個進階設定值,重新發佈資料庫專案,但在發佈前於 Publish Database 視窗中點選 Advanced。

進階選項中有許多發佈資料庫的細緻設定,有些設定只有在建立資料庫時才會進行,例如建立資料庫檔案和交易記錄檔,必須勾選【Always re-create database】,讓 Visual Studio 2013 自動產生 DROP DATABASE 以及 CREATE DATABASE 的 T-SQL 指令碼。

建議勾選【Backup up database before delpoyment】,讓 Visual Studio 2013 自動幫您產生備份資料庫的 T-SQL 指令碼,以避免造成不可復原的損失。

而預設【Script file size】是沒有勾選,亦即您在新增資料庫檔案或交易記錄檔時指定初始大小及自動成長等設定預設都會被忽略,所以如果您希望自行決定資料庫檔案或交易記錄檔的大小,記得勾選【Script the size】選項。

發佈資料庫前自動做備份的備份檔,會被放在目的伺服器的 SQL Server 預設備份路徑,如下圖所示。

設定完畢後按 OK,回到 Publish Database 視窗後,可以按下 Save Profile 來將 Advanced Publish Settings 儲存在發佈設定檔,最後按 Publish 來發佈資料庫專案。發佈成功之後回到 SSMS 查看資料庫檔案的設定狀況,您就可以看到如先前在資料庫專案相同的結果。


結論

資料庫專案非常方便且細緻,有許多細部設定藏在發佈選項或資料庫專案屬性之中,若您在發佈資料庫時不如預期的結果,可以朝這些設定來查看是否有什麼設定沒啟用。總結本文所介紹的內容,當您想要控制資料庫專案發佈時,有下列幾點須注意:

  1. 建立資料庫專案之後,建議先開啟專案屬性視窗來設定目標資料庫伺服器的版本、定序、ANSI 設定、復原模式及相容性層級等。

  2. 若要修改資料庫預設檔案群組,必須先建立檔案群組項目,才能在【Database Settings > Operational > Database Filegroup】選到 PRIMARY 以外的檔案群組。

  3. 若有在資料庫專案中建立交易記錄檔項目,必須也建立資料庫主檔案(mdf)否則會造成發佈失敗。

  4. 若有調整資料庫檔案或交易記錄檔初始大小、自動成長/大小限制,在發佈前必須要勾選【Script file size】。

  5. 建議勾選【Backup up database before delpoyment】讓發佈資料庫前自動進行資料庫備份。

  6. 正式環境中建議避免直接發佈資料庫專案,最好改由產生發佈指令碼並在發佈前確認內容是否正確。

參考資料

  1. How to: 加入檔案和檔案群組

  2. ALTER DATABASE 檔案及檔案群組選項 (Transact-SQL)

  3. Missing ADD FILEGROUP in Publish script when using Database Reference [VS 2012] [SSDT Sep 2012]

  4. Considerations when starting a new SSDT database project

  5. 建立資料庫 (Database Engine)