自訂多個環境的資料庫部署
作者 :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 ENGINE (MSBuild) 專案檔中的 VSDBCMD 命令,讓 VSDBCMD 選項適用于目標環境。
本主題將說明如何執行這些程式。
建立Environment-Specific部署組態檔
根據預設,資料庫專案包含名為 Database.sqldeployment的單一部署組態檔。 如果您在 Visual Studio 2010 中開啟此檔案,您可以看到可用的不同部署選項:
- 部署比較定序。 這可讓您選擇要使用專案的資料庫定序, (來源 定序) 或目的地伺服器的資料庫定序 (目標 定序) 。 在大部分情況下,當您部署至開發或測試環境時,您會想要使用來源定序。 當您部署到預備或生產環境時,通常會想要讓目標定序保持不變,以避免發生任何互通性問題。
- 部署資料庫屬性。 這可讓您選擇是否要套用資料庫屬性,如 Database.sqlsettings 檔案中所定義。 當您第一次部署資料庫時,應該部署資料庫屬性。 如果您要更新現有的資料庫,屬性應該已經就緒,而且您不應該再次部署它們。
- 一律重新建立資料庫。 這可讓您選擇每次部署或進行累加變更時,是否要重新建立目標資料庫,以使用架構讓目標資料庫變成最新狀態。 如果您重新建立資料庫,將會遺失現有資料庫中的任何資料。 因此,針對部署至預備環境或生產環境,您通常應該將此設定為 false 。
- 如果可能發生資料遺失,請封鎖累加部署。 這可讓您選擇部署是否應該在資料庫架構的變更造成資料遺失時停止。 您通常會將此設定為 true ,以便部署至生產環境,讓您有機會介入並保護任何重要的資料。 如果您已將 [永遠重新建立資料庫 ] 設定為 false,此設定將不會有任何作用。
- 以單一使用者模式執行部署。 這通常不是開發或測試環境中的問題。 不過,部署至預備環境或生產環境時,通常應該將此設定為 true 。 這可防止使用者在部署進行時對資料庫進行變更。
- 在部署之前備份資料庫。 當您部署至生產環境時,通常會將此設定為 true ,以防範資料遺失。 如果您預備資料庫包含大量資料,您可能也會想要將它設定為 true 。
- 針對目標資料庫中但不在資料庫專案中的物件產生 DROP 語句。 在大部分情況下,這是對資料庫進行累加式變更不可或缺的一部分。 如果您已將 [永遠重新建立資料庫 ] 設定為 false,此設定將不會有任何作用。
- 請勿使用 ALTER ASSEMBLY 語句來更新 CLR 類型。 此設定會決定SQL Server如何將 Common Language Runtime (CLR) 類型更新為較新的元件版本。 在大部分情況下,這應該設定為 false 。
下表顯示不同目的地環境的一般部署設定。 不過,您的設定可能會根據您的確切需求而有所不同。
開發人員/測試 | 預備/整合 | Production | |
---|---|---|---|
部署比較定序 | 來源 | 目標 | 目標 |
部署資料庫屬性 | 是 | 僅限第一次 | 僅限第一次 |
永遠重新建立資料庫 | 是 | False | 否 |
如果可能發生資料遺失,則封鎖累加部署 | 否 | 可能 | 是 |
以單一使用者模式執行部署腳本 | False | True | True |
在部署之前備份資料庫 | 否 | 可能 | 是 |
針對目標資料庫中但不在資料庫專案中的物件產生 DROP 語句 | False | True | True |
請勿使用 ALTER ASSEMBLY 陳述式來更新 CLR 型別 | False | False | 否 |
注意
如需資料庫部署屬性和環境考慮的詳細資訊,請參閱 資料庫專案設定概觀、 如何:設定部署詳細資料的屬性、 建置和部署資料庫至隔離的開發環境,以及建置 和部署資料庫至預備環境或生產環境。
若要支援將資料庫專案部署到多個目的地,您應該為每個目標環境建立部署設定檔。
建立環境特定的組態檔
在 Visual Studio 2010 的[方案總管] 視窗中,以滑鼠右鍵按一下您的資料庫專案,然後按一下 [屬性]。
在 [資料庫專案屬性] 頁面上的 [ 部署 ] 索引標籤上,按一下 [ 部署組態檔 ] 資料列中的 [ 新增]。
在 [ 新增部署組態檔 ] 對話方塊中,為檔案提供有意義的名稱 (例如 TestEnvironment.sqldeployment) ,然後按一下 [ 儲存]。
在 [Filename].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 上的這些文章提供有關資料庫部署的更一般指引: