部署資料庫專案

作者 :Jason Lee

注意

在許多企業部署案例中,您需要能夠將累加式更新發佈至已部署的資料庫。 替代方法是在每個部署上重新建立資料庫,這表示您會遺失現有資料庫中的任何資料。 當您使用 Visual Studio 2010 時,建議使用 VSDBCMD 來發行累加資料庫。 不過,下一版 Visual Studio 和 Web 發佈管線 (WPP) 將包含支援直接累加式發行的工具。

如果您在 Visual Studio 2010 中開啟連絡人管理員範例方案,您會看到資料庫專案包含包含四個檔案的 Properties 資料夾。

如果您在 Visual Studio 2010 中開啟連絡人管理員範例方案,您會看到資料庫專案包含包含四個檔案的 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 的電腦使用此方法,而且開發人員必須知道並提供所有目的地環境的連接字串和認證。
  • 您可以使用 Internet Information Services (IIS) Web Deployment Tool (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
支援累加式更新? No 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 檔案,並使用 [部署 ] 選項將 .dbschema 檔案部署到目標資料庫。
  • /manifest (或/ManifestFile) 參數會識別您要部署的 .deploymanifest 檔案。 如果您想要改用 .dbschema 檔案,請使用 /model (或 /ModelFile) 參數。
  • /cs (或/ConnectionString) 參數會提供目標資料庫伺服器的連接字串。 請注意,這不包含資料庫的名稱—VSDBCMD 必須連線到伺服器以建立資料庫;它不需要連線到個別資料庫。 如果您的 .deploymanifest 檔案包含連接字串,您可以省略此參數。 如果您仍然使用 參數,參數值將會覆寫 .deploymanifest 值。
  • /p:TargetDatabase屬性提供您想要在建立時指派給目標資料庫的名稱。 這會覆寫 .deploymanifest 檔案中 TargetDatabase 屬性的值。 您可以使用 /p:[property name]語法來設定各種不同的部署屬性,並覆寫 .sqlcmdvars 檔案中宣告的任何 SQLCMD 變數。
  • /dd+ (或/DeployToDatabase+) 參數表示您想要建立部署,並將其部署至目標環境。 如果您指定 /dd-,或省略 參數,VSDBCMD 將會產生部署腳本,但不會將其部署到目標環境。 此參數通常是混淆的來源,在下一節中會更詳細地說明。
  • /script (或/DeploymentScriptFile) 參數會指定您想要產生部署腳本的位置。 此值不會影響部署程式。

如需 VSDBCMD 的詳細資訊,請參閱 VSDBCMD.EXE (部署和架構匯入的命令列參考) 如何:使用 VSDBCMD.EXE從命令提示字元準備部署資料庫

如需如何從 MSBuild 專案檔使用 VSDBCMD 的範例,請參閱 瞭解建置程式。 如需如何為多個環境設定資料庫部署設定的範例,請參閱 自訂多個環境的資料庫部署

瞭解 DeployToDatabase 參數

/dd/DeployToDatabase參數的行為取決於您是否使用 VSDBCMD 搭配 .dbschema 檔案或 .deploymanifest 檔案。 如果您使用 .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 中資料庫專案的建置和部署程式概觀。 它也說明如何搭配 MSBuild 使用VSDBCMD.exe來支援企業級資料庫部署。

如需實際運作方式的詳細資訊,請參閱 自訂多個環境的資料庫部署

深入閱讀

如需如何為每個環境建立個別部署組態檔來自訂資料庫部署的資訊,請參閱 自訂多個環境的資料庫部署。 如需如何藉由執行部署後腳本來設定資料庫角色成員資格的指引,請參閱 將資料庫角色成員資格部署至測試環境。 如需管理成員資格資料庫所施加之一些獨特挑戰的指引,請參閱 將成員資格資料庫部署至企業環境

MSDN 上的這些主題提供 Visual Studio 資料庫專案和資料庫部署程式更廣泛的指引和背景資訊: