部署資料庫專案
演講者:Jason Lee
注意
在很多企業部署案例中,您需要能夠將累加式更新發佈至已部署的資料庫。 替代方法是在每個部署上重新建立資料庫,這表示您在現有資料庫中遺失任何數據。 當您使用 Visual Studio 2010 時,使用 VSDBCMD 是累加式資料庫發行的建議方法。 不過,下一版的Visual Studio和 Web 發佈管線 (WPP) 將包含支援直接累加發行的工具。
如果您在 Visual Studio 2010 中開啟 Contact Manager 範例解決方案,您會看到資料庫專案包含包含四個檔案的 Properties 資料夾。
在此案例中,這些檔案會與項目檔(ContactManager.Database.dbproj )一起控制建置和部署程式的各個層面:
- Database.sqlcmdvars 檔案會為您部署專案時使用的任何 SQLCMD 變數提供值。 每個解決方案組態(例如偵錯和發行)都可以指定不同的 .sqlcmdvars 檔案。
- Database.sqldeployment 檔案會提供部署特定設定,例如是否要使用專案中定義的定序或目的地伺服器的定序、每次重新建立目的地資料庫,或只是修改現有的資料庫以使其更新為最新狀態等等。 每個解決方案組態都可以指定不同的 .sqldeployment 檔案。
- Database.sqlpermissions 檔案是 XML 檔,可用來定義您想要新增至目標資料庫的任何許可權。 所有解決方案組態都會共用相同的 .sqlpermissions 檔案。
- Database.sqlsettings 檔案會指定建立資料庫時要使用的資料庫層級屬性,例如要使用的定序、比較運算符的行為等等。 所有解決方案組態都會共用相同的 .sqlsettings 檔案。
請務必花點時間在Visual Studio中開啟這些檔案,並熟悉內容。
當您建置資料庫專案時,建置程式會建立兩個檔案:
- 資料庫架構 (.dbschema 檔案)。 這描述您想要以 XML 格式建立的資料庫架構。
- 部署指令清單 (.deploymanifest 檔案)。 這包含建立及部署資料庫所需的所有資訊。 它會參考 .dbschema 檔案和其他資源,例如部署指示(.sqldeployment 檔案)和任何部署前或部署后 SQL 腳本。
這會顯示這些資源之間的關聯性:
如您所見,.sqlsettings 檔案和 .sqlpermissions 檔案是建置程序的輸入。 除了資料庫專案檔,這些檔案可用來建立資料庫架構檔案。 .sqldeployment 檔案和 .sqlcmdvars 檔案會以未變更方式傳遞建置程式。 部署指令清單會指出資料庫架構的位置、.sqldeployment 檔案、.sqlcmdvars 檔案,以及任何預先部署或部署后 SQL 腳本。
為何使用 VSDBCMD 來部署資料庫專案?
部署資料庫專案的方法有很多種。 不過,並非所有專案都適合將資料庫專案部署到企業環境中的遠端伺服器。 請考慮您要從資料庫專案部署的內容。 在企業部署案例中,您可能會想要:
- 能夠從遠端位置部署資料庫專案。
- 能夠對現有資料庫進行累加式更新。
- 能夠包含預先部署腳本或部署後腳本。
- 能夠針對多個目的地環境量身打造部署。
- 將資料庫專案部署為較大型、通常是腳本化的單一步驟解決方案部署的一部分。
有三個主要方法可用來部署資料庫專案:
- 您可以使用部署功能搭配 Visual Studio 2010 中的資料庫項目類型。 當您在Visual Studio 2010 中建置及部署資料庫專案時,部署程式會使用部署指令清單來產生組建組態特定的SQL型部署檔案。 如果資料庫不存在,則這會建立資料庫,如果資料庫已存在,則會對資料庫進行任何必要的變更。 您可以使用SQLCMD.exe在目的地伺服器上執行此檔案,也可以設定Visual Studio來建立和執行檔案。 這種方法的缺點是,您只對部署設定有有限的控制。 您通常也需要修改 SQL 部署檔案,以提供環境特定的變數值。 您只能從已安裝 Visual Studio 2010 的電腦使用此方法,開發人員必須知道並提供所有目的地環境的 連接字串 和認證。
- 您可以使用 網際網路資訊服務 (IIS) Web 部署工具 (Web Deploy) 將資料庫部署為 Web 應用程式專案的一部分。 不過,如果您想要部署資料庫專案,而不只是在目的地伺服器上複寫現有的本機資料庫,此方法會更加複雜。 您可以設定 Web Deploy 來執行資料庫項目產生的 SQL 部署文稿,但若要這樣做,您必須為 Web 應用程式專案建立自定義 WPP 目標檔案。 這會增加部署程式的大量複雜度。 此外,Web Deploy 不會直接支援現有資料庫的累加式更新。 如需此方法的詳細資訊,請參閱 將 Web 發佈管線延伸至封裝已部署 SQL 檔案的資料庫專案。
- 您可以使用 VSDBCMD 公用程式,使用資料庫架構或部署指令清單來部署資料庫。 您可以從 MSBuild 目標呼叫VSDBCMD.exe,這可讓您將資料庫發佈為較大腳本部署程式的一部分。 您可以從 VSDBCMD 命令覆寫 .sqlcmdvars 檔案中的變數,以及許多其他資料庫屬性,這可讓您針對不同的環境自定義部署,而不需要建立多個組建組態。 VSDBCMD 提供差異功能,這表示它只會進行必要的變更,以便讓目的地資料庫與您的資料庫架構保持一致。 VSDBCMD 也提供各種命令行選項,讓您更精細地控制部署程式。
在此概觀中,您可以看到搭配 MSBuild 使用 VSDBCMD 是最適合一般企業部署案例的方法:
支援 | Visual Studio 2010 | Web Deploy 2.0 | VSDBCMD.exe |
---|---|---|---|
支援遠端部署? | Yes | .是 | Yes |
支援累加式更新? | 是 | 無 | Yes |
支援部署前/部署後腳本? | Yes | .是 | Yes |
支援多環境部署? | 有限 | 有限 | Yes |
支援腳本部署? | 有限 | Yes | Yes |
本主題的其餘部分說明搭配 MSBuild 使用 VSDBCMD 來部署資料庫專案。
瞭解部署程式
VSDBCMD 公用程式可讓您使用資料庫架構(.dbschema 檔案)或部署指令清單(.deploymanifest 檔案)來部署資料庫。 實際上,您幾乎一律會使用部署指令清單,因為部署指令清單可讓您提供各種部署屬性的預設值,並識別您想要執行的任何部署前或部署后 SQL 腳本。 例如,這個 VSDBCMD 命令可用來將 ContactManager 資料庫部署到測試環境中的資料庫伺服器:
vsdbcmd.exe /a:Deploy
/manifest:"…\ContactManager.Database.deploymanifest"
/cs:"Data Source=TESTDB1;Integrated Security=true"
/p:TargetDatabase=ContactManager
/dd+
/script:"…\Publish-ContactManager-Db.sql"
在此案例中:
- /a (或 /Action) 參數會指定您想要 VSDBCMD 執行的動作。 您可以將此設定為 [ 匯 入] 或 [部署]。 [ 匯 入] 選項可用來從現有的資料庫產生 .dbschema 檔案,並使用 Deploy 選項將 .dbschema 檔案部署到目標資料庫。
- /manifest (或 /ManifestFile) 參數會識別您要部署的 .deploymanifest 檔案。 如果您想要改用 .dbschema 檔案,請使用 /model (或 /ModelFile) 參數。
- /cs (或 /ConnectionString) 參數會為目標資料庫伺服器提供 連接字串。 請注意,這不包含資料庫的名稱—VSDBCMD 必須連線到伺服器以建立資料庫;它不需要連線到個別資料庫。 如果您的 .deploymanifest 檔案包含 連接字串,您可以省略此參數。 如果您還是使用 參數,參數值將會覆寫 .deploymanifest 值。
- /p:TargetDatabase 屬性會提供您想要在建立時指派給目標資料庫的名稱。 這會覆寫 .deploymanifest 檔案中 TargetDatabase 屬性的值。 您可以使用 /p: [屬性名稱]語法來設定各種不同的部署屬性,並覆寫 .sqlcmdvars 檔案中宣告的任何 SQLCMD 變數。
- /dd+ (或 /DeployToDatabase+) 參數表示您想要建立部署,並將其部署至目標環境。 如果您指定 /dd-,或省略 參數,VSDBCMD 會產生部署腳本,但不會將它部署到目標環境。 這個參數通常是混淆的來源,在下一節中會更詳細地說明。
- /script (或 /DeploymentScriptFile) 參數會指定您想要產生部署腳本的位置。 此值不會影響部署程式。
如需 VSDBCMD 的詳細資訊,請參閱 VSDBCMD.EXE 的命令行參考(部署和架構匯入) 和 如何:使用 VSDBCMD.EXE 從命令提示字元準備部署資料庫。
如需如何從 MSBuild 專案檔使用 VSDBCMD 的範例,請參閱 瞭解建置程式。 如需如何為多個環境設定資料庫部署設定的範例,請參閱 自定義多個環境的資料庫部署。
瞭解 DeployToDatabase 參數
/dd 或 /DeployToDatabase 參數的行為取決於您是搭配 .dbschema 檔案還是 .deploymanifest 檔案使用 VSDBCMD。 如果您使用 .dbschema 檔案,行為相當簡單:
- 如果指定 /dd+ 或 /dd,VSDBCMD 將產生部署指令碼並部署資料庫。
- 如果指定 /dd- 或省略該開關,VSDBCMD 將僅產生部署指令碼。
如果您使用 .deploymanifest 檔案,則行為會更加複雜。 這是因為 .deploymanifest 檔案包含屬性名稱 DeployToDatabase ,也決定是否部署資料庫。
<DeployToDatabase>False</DeployToDatabase>
此屬性的值會根據資料庫項目的屬性來設定。 如果您將 [部署] 動作 設定為 [建立部署腳本] (.sql),則值為 False。 如果您將 [部署] 動作設定為 [建立部署腳本](.sql),並部署至資料庫,則值為 True。
注意
這些設定會與特定的組建組態和平臺相關聯。 例如,如果您設定偵錯組態的設定,然後使用發行組態發佈,將不會使用您的設定。
注意
在此案例中 ,部署動作 應該一律設定為 建立部署腳本 (.sql),因為您不希望Visual Studio 2010部署資料庫。 換句話說, DeployToDatabase 屬性應該一律為 False。
指定 DeployToDatabase 屬性時,只有在屬性值為 false 時,/dd 參數才會覆寫 屬性:
- 如果 DeployToDatabase 屬性為 False,而且您指定 /dd+ 或 /dd,VSDBCMD 將會覆寫 DeployToDatabase 屬性並部署資料庫。
- 如果 DeployToDatabase 屬性為 False,而且您指定 /dd- 或省略參數,VSDBCMD 將不會部署資料庫。
- 如果 DeployToDatabase 屬性為 True,VSDBCMD 將會忽略 參數並部署資料庫。
- 不論您是否同時部署資料庫,都會在每個案例中產生部署腳本。
結論
本主題提供Visual Studio 2010 中資料庫專案的建置和部署程式概觀。 它也描述如何使用 VSDBCMD.exe 搭配 MSBuild 來支援企業級資料庫部署。
如需實際運作方式的詳細資訊,請參閱 自定義多個環境的資料庫部署。
深入閱讀
如需如何為每個環境建立個別部署組態檔來自定義資料庫部署的資訊,請參閱 自定義多個環境的資料庫部署。 如需如何執行部署後腳本來設定資料庫角色成員資格的指引,請參閱 將資料庫角色成員資格部署至測試環境。 如需管理成員資格資料庫所強加之一些獨特挑戰的指引,請參閱 將成員資格資料庫部署至企業環境。
MSDN 上的這些主題提供有關 Visual Studio 資料庫專案和資料庫部署程式的廣泛指引和背景資訊: