資料庫建置與部署概觀
更新:2010 年 7 月
若要從「資料庫專案」(Database Project) 建立資料庫或將現有資料庫的更新發佈到資料庫伺服器,您必須先建置此資料庫專案,然後再將它部署到該伺服器。
建置步驟會將資料庫專案編譯成可供部署的檔案。 這些檔案包括 .dbschema 檔、.deploymentmanifest 檔以及預先部署和部署後指令碼。 當您建置資料庫專案時,不會與目標資料庫進行比較。 當您部署資料庫專案時,建置動作的輸出才會與目標資料庫 (如果存在) 比較,並指出必須執行以更新目標以符合資料庫專案的動作。 根據您的設定,這些更新會部署到目標資料庫。
或者,您也可以產生部署指令碼 (.SQL 檔),然後在部署到開發用或實際執行伺服器之前,使用 [Transact-SQL 編輯器] 或其他工作 (例如,SQL Server Management Studio) 修改它。 「清除」建置動作會刪除任何現有的組建成品,例如指令碼、部署資訊清單和 .dbschema 檔。
部署指令碼
您可以建立指令碼,使其在建立或更新目標的指令碼之前或之後執行。 只能有一個預先部署指令碼及一個部署後指令碼,但是這兩個指令碼中可以包含其他指令碼。 如需詳細資訊,請參閱建立和修改資料庫指令碼。
部署資訊清單
當您建置資料庫專案時,會產生部署資訊清單。 此資訊清單包含所有專案層級組態資訊,可讓您在不需要另外資料庫專案檔 (.dbproj) 的情況下進行部署。
部署資訊清單 (.deploymanifest) 是 XML 檔,結構與 MSBuild 專案檔非常類似。 .deploymanifest 檔會在資料庫專案資料夾的 sql\Configuration 資料夾中建立,其中 Configuration 是組建組態,例如偵錯或發行。
下列範例顯示名為 Empty2008DbProj 之空 SQL Server 2008 資料庫專案的 .deploymanifest 檔:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetConnectionString>Data Source=stevenpoauth\sql2k8;Integrated Security=True;Pooling=False</TargetConnectionString>
<TargetDatabase>Empty2008DbProj</TargetDatabase>
<DeployToDatabase>True</DeployToDatabase>
<DeployToScript>True</DeployToScript>
<SourceModel>Empty2008DbProj.dbschema</SourceModel>
<DeployScriptFileName>Empty2008DbProj.sql</DeployScriptFileName>
<DeploymentConfigurationFile>Empty2008DbProj_Database.sqldeployment</DeploymentConfigurationFile>
</PropertyGroup>
<PropertyGroup>
<SqlCommandVariablesFile>Empty2008DbProj_Database.sqlcmdvars</SqlCommandVariablesFile>
</PropertyGroup>
<ItemGroup>
<DeploymentExtensionConfiguration Include="Empty2008DbProj_Script.PostDeployment.sql">
<__PostdeploymentMetadata>
</__PostdeploymentMetadata>
</DeploymentExtensionConfiguration>
<DeploymentExtensionConfiguration Include="Empty2008DbProj_Script.PreDeployment.sql">
<__PredeploymentMetadata>
</__PredeploymentMetadata>
</DeploymentExtensionConfiguration>
</ItemGroup>
<ItemGroup>
<DeploymentExtension Include="Microsoft.Data.Schema.Sql.Build.SqlPlanOrderModifier">
<Assembly>Microsoft.Data.Schema.Sql</Assembly>
<Version>10.0.0.0</Version>
<Token>sD9ffxHVCjo=</Token>
</DeploymentExtension>
<DeploymentExtension Include="Microsoft.Data.Schema.Sql.Build.SqlPrePostDeploymentModifier">
<Assembly>Microsoft.Data.Schema.Sql</Assembly>
<Version>10.0.0.0</Version>
<Token>sD9ffxHVCjo=</Token>
</DeploymentExtension>
<DeploymentExtension Include="Microsoft.Data.Schema.Sql.Refactoring.SqlRefactoringDeploymentContributor">
<Assembly>Microsoft.Data.Schema.Sql</Assembly>
<Version>10.0.0.0</Version>
<Token>sD9ffxHVCjo=</Token>
</DeploymentExtension>
</ItemGroup>
</Project>
部署資訊清單檔包含一個或多個 PropertyGroup 節點,這些節點會定義部署時使用的預設組態。 部署資訊清單檔也包含 ItemGroup 節點,這些節點又包含 DeploymentExtensionConfiguration 節點和 Reference 節點。
DeploymentExtensionConfiguration 節點會定義部署時傳遞到部署擴充的組態檔案。 這些組態檔案包括預先部署和部署後指令碼,以及部署時用來保留原意的重構記錄。
Reference 節點則會定義專案所參考以及建置專案時複製到輸出資料夾的任何成品。 參考的檔案會在部署時處理,以確保正確重新建立資料庫的模型。
部署指令碼中的交易
部署指令碼中的多數資料庫變更都是在交易內發生,這樣一來,如果部署失敗,就可以復原變更。 不過,下列物件則是在部署交易以外建立、更新或刪除。
SQL Server 版本 |
部署交易以外的物件 |
---|---|
SQL Server 2008 |
伺服器角色成員資格 端點 全文檢索索引 全文檢索目錄 連結的伺服器 連結的伺服器登入 事件工作階段 伺服器稽核規格 全文檢索停用字詞表 |
SQL Server 2005 |
伺服器角色成員資格 端點 全文檢索索引 全文檢索目錄 連結的伺服器 連結的伺服器登入 |
一般來說,這些物件是使用系統預存程序維護,因此必須在部署交易以外。
部署變更到現有資料庫的考量
當您將變更部署到現有資料庫時,某些變更可能會造成資料遺失。 如果變更可能會造成資料表中的資料遺失,而且選取了 [如果可能發生資料遺失,則封鎖累加部署] 核取方塊,將會取消此部署。 這個核取方塊預設為選取,但您可以在專案的 [屬性] 視窗找到它。 如需詳細資訊,請參閱資料庫專案設定概觀。
將會造成資料遺失的變更類型如下:如果卸除了資料表之後又重新建立它、變更資料行的大小 (從 char(100) 變更為 char(50) 或是從 nchar(100) 變更為 char(100)),或者變更具有字元型別之資料行的定序。
注意事項 |
---|
當您使用重構來重新命名資料庫物件,或將資料庫物件移至其他結構描述時,重構記錄檔會記錄該動作。 進行部署時,記錄檔中的資訊會幫助您保留原本變更的意圖。 例如,重新命名資料表可能會遺失資料,因為資料表會卸除,然後以新名稱建立資料表。 若使用重構記錄檔,部署指令碼可改為重新命名資料表,保留您的意圖和資料。 |
復原失敗的部署
如果您的部署在部署指令碼的交易區段外失敗,您可能會遺失資料。 基於這個原因,您應該認真考慮在部署前,先讓共用資料庫進入單一使用者模式並備份它。
排除的檔案
如果您從資料庫專案中排除某些檔案,這些檔案中所定義的「資料庫物件」(Database Object),將不會包含在資料庫專案建置時所建立的 .dbschema 檔案中。 這些物件並不會受到部署,因為它們未包含在 .dbschema 檔案中。 如果您仍在處理一個或多個物件,但是想要部署已經完成的工作,您可以從組建中排除一些檔案,而僅將已就緒的物件納入 .dbschema 檔案中並部署至目標資料庫。 之後當這些檔案準備好可以部署時,您便可以包含這些檔案,而部署作業將會以新的物件來更新資料庫,而不會修改現有的物件 (如果尚未在專案中變更這些物件)。 如需詳細資訊,請參閱 HOW TO:從資料庫專案排除檔案。
重要事項 |
---|
如果您將存在於目標資料庫的物件排除在資料庫專案以外,然後部署該專案,可能會遺失資料。 如果在部署組態中選取 [為存在目標資料庫,但不存在資料庫專案中的物件產生 DROP 陳述式] 核取方塊,將會從目標資料庫刪除這些物件。 |
伺服器專案
伺服器專案包含 "master" 資料庫物件的定義。 伺服器專案的目標資料庫名稱一律是 "master"。 針對每項伺服器設定,您可以指定部署伺服器專案時是否要驗證該設定的值。 系統會忽略您不驗證的設定。 如果伺服器設定的值與您要驗證的設定值不相符,部署會失敗並出現錯誤訊息。
命令列建置
除了在可以在 Visual Studio 使用者介面中執行建置、部署或清除動作外,您也可以使用 MSBuild.exe 在命令提示字元中執行這些動作。 您可以指定 Build、Deploy、Rebuild 和 Clean 目標。 根據預設,建置和部署程序會使用資料庫專案中所定義的專案屬性 (在 .dbproj 檔案或 .dbproj.user 檔案中)。 但是,您可以在命令提示字元或是從回應檔來覆寫這些屬性。
重要事項 |
---|
在執行命令列建置之前,應該先關閉 Visual Studio。 如果您在 Visual Studio 執行中時執行命令列建置,則可能不會攔截到某些錯誤。 |
您也可以使用 VSDBCMD.EXE 從命令提示字元部署 .dbschema 檔案。 您可以在未安裝 Visual Studio 的電腦上使用 VSDBCMD。 如需詳細資訊,請參閱 HOW TO:使用 VSDBCMD.EXE 從命令提示字元準備資料庫進行部署。 當您部署到實際執行環境時,您可以使用 VSDBCMD 或產生部署指令碼,然後使用 [Transact-SQL Editor] 或其他工具 (例如 [SQL Server Management Studio]) 手動部署該指令碼。
命令列語法
您可以使用下列語法範例,在命令提示字元建置資料庫專案:
MSBuild /target:Build MySolutionName.sln
這個範例會在名為 MySolutionName.sln 的方案上執行建置動作 (使用此方案所含之專案檔案內指定的專案屬性)。 如果此方案包含多個資料庫專案,這些專案會與方案內的所有其他項目一起建置。 您也可以建置特定的資料庫專案。 Build 目標會在產生的建置指令碼中包含預先部署和部署後指令碼。MSBuild /target:Deploy /p:UseSandboxSettings=false /p:TargetDatabase=UpdatedTargetDatabase;TargetConnectionString="Data Source=(local)\SQLEXPRESS;Integrated Security=True;Pooling=False" MyProjectName.dbproj
這個範例會示範如何部署資料庫專案,並覆寫目標資料庫名稱和連接字串。MSBuild /target:Deploy /p:UseSandboxSettings=false /p:DeploymentConfiguration=DeployPath\AlternateDeploymentConfiguration.deploymentconfig /p:SqlCommandVarsFile=VarPath\AlternateVariables.sqlcmdvars /p:TargetDatabase=UpdatedTargetDatabase;TargetConnectionString="Data Source=(local)\SQLEXPRESS;Integrated Security=True;Pooling=False" MyProjectName.dbproj
這個範例會示範如何部署資料庫專案,並指定不同的目標資料庫和連接字串,以及覆寫部署組態和部署變數。MSBuild /target:Deploy /p:UseSandboxSettings=false /p:BuildScriptName=MyScriptName.sql /p:outdir=BuildScriptPath /p:TargetDatabase=UpdatedTargetDatabase;TargetConnectionString="Data Source=InstanceName\DatabaseName;Integrated Security=True;Pooling=False" ProjectPath\MyProjectName.dbproj
這個範例會示範如何部署電腦上的資料庫,而該電腦與進行建置的電腦是不同的。 例如,如果您是以中央建置電腦於每晚建立建置指令碼,則可能會使用此語法。 您必須指定建置指令碼名稱、建置指令碼所在的路徑 (outdir)、目標資料庫,以及資料庫專案的路徑和檔名。MSBuild @dbbuild.arf MyProjectName.dbproj
這個範例會示範如何使用回應檔來提供命令列引數。 dbbuild.arf 檔可包含任何有效的 MSBuild 引數,包括會覆寫專案屬性的那些引數。MSBuild /target:Rebuild MyProjectName.dbproj
這個範例會重新建置指定的專案或方案,甚至在該專案或方案於上次建置之後尚未變更時,也會重新建置。MSBuild /target:Clean MyProjectName.dbproj
這個範例會示範如何刪除任何現有的建置指令碼。 多數常見的作法是搭配另一個建置或部署動作來使用這個動作。
注意事項 |
---|
您可以將 /target: 縮寫為 /t: 並將 /property: 縮寫為 /p:。 |
如需詳細資訊,請參閱 MSBuild 命令列參考。
如需回應檔的詳細資訊,請參閱 Microsoft 網站上的這個主題:MSBuild 回應檔。
注意事項 |
---|
若要執行 MSBuild.exe,您必須使用 Visual Studio 命令提示字元,或是執行 vsvars32.bat 批次檔。 您可以在 %VS80COMNTOOLS% 環境變數指定的資料夾中找到此批次檔。 |
組建電腦上的必要軟體
Visual Studio Team Foundation Server 2010 針對建置、部署、單元測試及產生資料庫專案的資料等作業,提供原生支援。 您不必在組建電腦上安裝 Visual Studio。 如果您沒有在組建電腦上使用 Visual Studio Team Foundation Server 2010,則必須在組建電腦上安裝 Visual Studio 2010 Professional、Visual Studio 2010 Premium 或 Visual Studio 2010 Ultimate。
此外,如果您要從 Team Foundation Build 部署資料庫,而不是在資料庫單元測試執行時部署,則必須執行額外的安裝。 您必須將 %PROGRAM FILES%\Microsoft Visual Studio 10.0\VSTSDB\Deploy 資料夾及其內容 (包括子資料夾) 從 Visual Studio 2010 安裝複製到組建電腦。 如需詳細資訊,請參閱 HOW TO:使用 Team Foundation Build 部署變更和逐步解說:定義自訂工作流程來從 Team Foundation Build 部署資料庫。
專案屬性
資料庫和伺服器專案的某些屬性會影響將要建置及部署這些專案的方式, 這些屬性會儲存專案檔和 .user 檔案中,但您可以在命令提示字元或回應檔覆寫這些屬性。 如需詳細資訊,請參閱 HOW TO:設定資料庫和伺服器專案的建置設定和 HOW TO:設定資料庫和伺服器專案的部署設定。
覆寫部署資訊清單屬性
從命令列部署時,您可以覆寫預設部署屬性 (例如部署組態、連接字串或 SQLCMD 變數)。 如果您想將 .dbschema 檔部署到多個環境中,就可以選擇這麼做。
例如,如果您想要將 EnterpriseDB.dbproj 中定義的結構描述部署到開發、測試和實際執行環境,可以使用下列命令列:
部署環境
MSBuild EnterpriseDB.dbproj /t:Deploy /p:UseSandboxSettings=false /p:DeploymentConfigurationFile=sql\debug\Development.sqldeployment /p:SqlCommandVariablesFile=sql\debug\Development.sqlcmdvars /p:TargetConnectionString="Data Source=DEV\sql2008;Integrated Security=true;Pooling=false"
測試環境
MSBuild EnterpriseDB.dbproj /t:Deploy /p:UseSandboxSettings=false /p:DeploymentConfigurationFile=sql\debug\UserTest.sqldeployment /p:SqlCommandVariablesFile=sql\debug\UserTest.sqlcmdvars /p:TargetConnectionString="Data Source=USERTEST\sql2008;Integrated Security=true;Pooling=false"
實際執行環境
MSBuild EnterpriseDB.dbproj /t:Deploy /p:UseSandboxSettings=false /p:DeploymentConfigurationFile=sql\debug\Production.sqldeployment /p:SqlCommandVariablesFile=sql\debug\Production.sqlcmdvars /p:TargetConnectionString="Data Source=PRODUCTION\sql2008;Integrated Security=true;Pooling=false"
在每個環境中,您可以提供不同的部署組態檔、不同的 SQLCMD 變數檔以及不同的連接字串。
請參閱
工作
HOW TO:建置資料庫專案來產生已編譯的結構描述 (.dbschema) 檔案
概念
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2010 年 7 月 |
釐清組建電腦上需要哪些軟體以解決 MSDN 論壇上回報的問題。 |
客戶回函。 |