為多個環境自訂資料庫部署

由Jason Lee

本主題介紹如何在部署程序中,根據特定目標環境自訂資料庫的屬性。

注意

本主題假設您使用 MSBuild.exe 和 VSDBCMD.exe 部署 Visual Studio 2010 資料庫專案。 有關為什麼選擇此方法的更多資訊,請參閱《企業中的 Web 部署》和《部署資料庫專案》。

將資料庫專案部署到多個目標時,您通常需要為每個目標環境自訂資料庫部署屬性。 例如,在測試環境中,您通常會在每次部署時重新建立資料庫,而在預備環境或生產環境中,您更有可能進行增量更新,以保留資料。

在 Visual Studio 2010 資料庫專案中,部署設定包含在部署設定 (.sqldeployment) 檔案中。 本主題將示範如何建立環境專屬的部署設定檔並指定要用作 VSDBCMD 參數的設定檔。

本主題是圍繞虛構公司Fabrikam, Inc. 企業部署需求設計的教學課程系列中的一環。本教學課程系列透過範例方案“連絡人管理員方案”來展示具現實複雜性的Web應用程式,其中包括ASP.NET MVC 3應用程式、Windows Communication Foundation (WCF)服務以及資料庫專案。

這些教程的主要部署方法是基於「了解專案檔案」中描述的分割專案檔案方法。在這個方法中,建置過程由兩個專案檔案負責控制:一個包含適用於所有目標環境的建置指令,另一個則包含針對特定環境的建置與部署設定。 在建置時,環境專屬的專案檔案被合併到與環境無關的專案檔案中,以形成完整的建置指令集。

任務概述

本主題假設:

  • 您可以使用分割專案檔案的方法來進行方案部署,如「了解專案檔案」中所述。
  • 您可以從專案檔案中使用 VSDBCMD 來部署您的資料庫專案,如 了解建置程序 中所述。

若要建立支援在目標環境之間改變資料庫部署屬性的部署系統,您需要:

  • 為每個目標環境建立部署設定 (.sqldeployment) 檔案。
  • 建立 VSDBCMD 命令,將部署設定檔指定為命令列開關。
  • 在 Microsoft Build 引擎 (MSBuild) 專案檔案中參數化 VSDBCMD 指令,以便 VSDBCMD 選項適合目標環境。

本主題將示範如何執行其中每個流程。

建立環境專屬的部署設定檔

預設情況下,資料庫專案包含一個名為 Database.sqldeployment 的部署設定檔。 如果在 Visual Studio 2010 中開啟此文件,您可以看到可用的不同部署選項:

  • 部署比較排序規則。 這使您可以選擇使用項目的資料庫排序規則 (來源排序規則) 還是目標伺服器的資料庫排序規則 (目標排序規則)。 在大多數情況下,當您部署到開發或測試環境時,您需要使用來源排序規則。 當您部署到預備或生產環境時,您通常希望保持目標排序規則不變,以避免任何互通性問題。
  • 部署資料庫屬性。 這使您可以選擇是否要套用 Database.sqlsettings 檔案中定義的資料庫屬性。 首次部署資料庫時,應部署資料庫屬性。 如果您要更新現有資料庫,則屬性應該已經就位,並且不需要再次部署它們。
  • 永遠重新建立資料庫。 這使您可以選擇在每次部署時重新建立目標資料庫,還是進行增量變更以使目標資料庫與您的架構保持同步。 如果重新建立資料庫,您將遺失現有資料庫中的所有資料。 因此,對於測試環境或生產環境的部署,您通常應該將其設為 false。
  • 如果可能發生資料遺失,則封鎖累加部署。 這使您可以選擇如果資料庫架構的變更將導致資料遺失,部署是否應該停止。 對於生產環境的部署,您通常會將其設為 True,以便您有機會干預和保護任何重要資料。 如果您將永遠重新建立資料庫設定為 False,則此設定將無法運作。
  • 在單一使用者模式下執行部署。 在開發環境或測試環境中,這通常不是問題。 但是,對於預備或生產環境的部署,您通常應該將其設為 true。 這可以防止使用者在部署程序中對資料庫進行變更。
  • 部署前備份資料庫。 當您部署到生產環境時,通常會將其設為 True,以防止資料遺失。 如果您的預備資料庫包含大量資料,那麼在部署到預備環境時,您可能還需要將其設為 True。
  • 為存在於目標資料庫中,但不存在於資料庫專案中的物件產生 DROP 陳述式。 在大多數情況下,這是對資料庫進行逐步變更時必不可少的一部分。 如果您將永遠重新建立資料庫設定為 False,則此設定將無法運作。
  • 請勿使用 ALTER ASSEMBLY 陳述式來更新 CLR 類型。 此設定會決定 SQL Server 應如何將公共語言執行時期 (CLR) 類型更新為較新的組件版本。 在大多數情況下,應將其設為 False。

此表顯示不同目標環境的典型部署設定。 但是,根據您的特定要求,您的設定可能會有所不同。

開發/測試 分期/整合 實際生產環境
部署比較匯編 來源 Target Target
部署資料庫屬性 真 僅限第一次 僅限第一次
永遠重新建立資料庫 真 假 假
如果可能發生資料遺失,則封鎖累加部署 假 可能 真
在單一使用者模式下執行部署指令碼 假 真 真
部署前備份資料庫 假 可能 真
為存在於目標資料庫中,但不存在於資料庫專案中的物件產生 DROP 陳述式 假 真 真
請勿使用 ALTER ASSEMBLY 陳述式來更新 CLR 類型 假 假 假

注意

有關資料庫部署屬性和環境考量的更多資訊,請參閱〈資料庫專案設定概覽〉、〈如何設定部署詳細資訊的屬性〉、〈建置並部署資料庫到獨立開發環境〉,以及〈建置和部署資料庫到過渡或生產環境〉。

為了支援將資料庫專案部署到多個目標,您應該為每個目標環境建立一個部署設定檔。

要建立環境專屬的設定檔

  1. 在 Visual Studio 2010 的「方案總管」視窗中,以滑鼠以滑鼠右鍵按一下資料庫項目,然後按一下「屬性」。

  2. 在資料庫專案屬性頁的「部署」標籤上的「部署設定檔」行中,按一下「新增」。

    在資料庫專案屬性的「部署」標籤中,在「部署設定檔」行中,按一下「新增」。

  3. 在「新部署設定檔」對話方塊中,為檔案指定一個有意義的名稱 (例如 TestEnvironment.sqldeployment),然後按一下「儲存」。

  4. 在 [檔案名稱].sqldeployment 頁面上,設定部署屬性以符合目標環境的要求,然後儲存檔案。

    在 "Filename .sqldeployment" 頁面上,設定部署屬性以符合您環境的需求,然後儲存檔案。

  5. 請注意,新文件已新增至資料庫項目的 Properties 資料夾中。

    請注意,新檔案已新增至資料庫專案中的 Properties 資料夾。

在 VSDBCMD 中指定部署設定檔

當您在 Visual Studio 2010 中使用解決方案設定 (例如「偵錯」和「發佈」) 時,可以將部署設定檔與每個設定相關聯。 當您建置特定設定時,建置程序會產生一個特定於設定的部署清單文件,該文件指向特定於設定的部署設定檔。 然而,這些教學課程中描述的部署方法的主要目標之一,是使人們能夠在不使用 Visual Studio 2010 和解決方案設定的情況下控制部署程序。 在此方法中,無論目標部署環境如何,解決方案設定都是相同的。 若要根據特定目標環境自訂資料庫部署,您可以使用 VSDBCMD 命令列選項來指定部署設定檔。

若要在 VSDBCMD 中指定部署設定文件,請使用 p:/DeploymentConfigurationFile 開關並提供檔案的完整路徑。 這將覆蓋部署清單識別的部署配置文件。 例如,您可以使用下列 VSDBCMD 命令將 ContactManager 資料庫部署至測試環境:

vsdbcmd.exe /a:Deploy
            /manifest:"…\ContactManager.Database.deploymanifest"
            /cs:"Data Source=TESTDB1;Integrated Security=true"
            /p:TargetDatabase=ContactManager
            /p:DeploymentConfigurationFile=
              "…\ContactManager.Database_TestEnvironment.sqldeployment"
            /dd+
            /script:"…\Publish-ContactManager-Db.sql"

注意

請注意,建置程序在將檔案複製到輸出目錄時可能會重新命名 .sqldeployment 檔案。

如果您在部署前或部署後 SQL 指令碼中使用 SQL 命令變數,則可以使用類似的方法將環境專屬的 .sqlcmdvars 檔案與您的部署相關聯。 在這種情況下,您可以使用 p:/SqlCommandVariablesFile 開關來識別 .sqlcmdvars 檔案。

從 MSBuild 專案檔案執行 VSDBCMD 命令

您可以使用 MSBuild 目標中的 Exec 任務從 MSBuild 專案檔案呼叫 VSDBCMD 命令。 最簡單的形式是這樣的:

<Target Name="DeployDatabase">     
   <PropertyGroup>      
      <_Cmd>
         Add your VSDBCMD command here
      </_Cmd>
   </PropertyGroup>
   <Exec Command="$(_Cmd)"/> 
 </Target>
  • 在實務上,若要讓專案檔案易於閱讀和重複使用,您需要建立屬性來儲存各種命令列參數。 這使使用者可以更輕鬆地在環境專屬的專案檔案中提供屬性值,或從 MSBuild 命令列複寫預設值。 如果您使用「了解專案檔案」中所述的拆分專案檔案方法,則應根據兩個檔案的不同適當地劃分您的建置指令和屬性:
  • 環境專屬的設定 (例如部署設定檔名稱、資料庫連接字串和目標資料庫名稱) 應位於環境專屬的專案檔案中。
  • 執行 VSDBCMD 命令的 MSBuild 目標以及任何通用屬性 (例如 VSDBCMD 執行檔的位置) 應放入通用專案檔案中。

您還應該確保在呼叫 VSDBCMD 之前建立資料庫專案,以便建立 .deploymanifest 檔案並準備使用。 您可以在「了解建置程序」主題中查看此方法的完整範例,該主題將引導您瀏覽「連絡人管理員範例解決方案」中的專案文件。

結論

本主題介紹了在使用 MSBuild 和 VSDBCMD 部署資料庫專案時,如何根據不同的目標環境自訂資料庫屬性。 當您需要將資料庫專案部署為大型企業級解決方案的一部分時,此方法非常有用。 這些解決方案通常部署到多個目的地,例如沙盒開發或測試環境、預備或整合平台以及生產或即時環境。 這些目標環境中的每一個通常都需要一組唯一的資料庫部署屬性。

深入閱讀

有關使用 VSDBCMD.exe 部署資料庫專案的詳細資訊,請參閱「部署資料庫專案」。 有關使用自訂 MSBuild 專案檔案以控制部署流程的更多資訊,請參閱「了解專案檔案」和「了解建置流程」。

MSDN 上的這些文章提供了更普遍的資料庫部署指引: