共用方式為


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

演講者: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
部署資料庫屬性 True 僅限第一次 僅限第一次
永遠重新建立資料庫 True False False
如果可能發生資料遺失,則封鎖累加部署 False 可能 True
在單一使用者模式下執行部署指令碼 False True True
部署前備份資料庫 False 可能 True
為存在於目標資料庫中,但不存在於資料庫專案中的物件產生 DROP 陳述式 False True True
請勿使用 ALTER ASSEMBLY 陳述式來更新 CLR 類型 False False False

注意

有關資料庫部署屬性和環境注意事項的詳細資訊,請參閱「資料庫專案設定概述」、「作法:設定部署詳細資訊的屬性」、「建置資料庫並將其部署到獨立的開發環境」,以及「建置和部署資料庫到預備環境或生產環境」。

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

要建立環境專屬的設定檔

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

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

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

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

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

    在檔案名稱 .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 上的這些文章提供了更普遍的資料庫部署指引: