為多個環境自訂資料庫部署
演講者: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) 服務,和資料庫專案。
這些教學課程的核心部署方法是根據「了解專案檔案」中所述的分割專案檔案方法,其中建置程序由兩個專案檔案控制,一個包含適用於所有目標環境的建置指令,另一個則包含環境專屬的建置和部署設定。 在建置時,環境專屬的專案檔案被合併到與環境無關的專案檔案中,以形成完整的建置指令集。
任務概述
本主題假設:
若要建立支援在目標環境之間改變資料庫部署屬性的部署系統,您需要:
- 為每個目標環境建立部署設定 (.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 |
注意
有關資料庫部署屬性和環境注意事項的詳細資訊,請參閱「資料庫專案設定概述」、「作法:設定部署詳細資訊的屬性」、「建置資料庫並將其部署到獨立的開發環境」,以及「建置和部署資料庫到預備環境或生產環境」。
為了支援將資料庫專案部署到多個目標,您應該為每個目標環境建立一個部署設定檔。
要建立環境專屬的設定檔
在 Visual Studio 2010 的「方案總管」視窗中,以滑鼠以滑鼠右鍵按一下資料庫項目,然後按一下「屬性」。
在資料庫專案屬性頁的「部署」標籤上的「部署設定檔」行中,按一下「新增」。
在「新部署設定檔」對話方塊中,為檔案指定一個有意義的名稱 (例如 TestEnvironment.sqldeployment),然後按一下「儲存」。
在 [檔案名稱].sqldeployment 頁面上,設定部署屬性以符合目標環境的要求,然後儲存檔案。
請注意,新文件已新增至資料庫項目的 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 上的這些文章提供了更普遍的資料庫部署指引: