部署数据库项目

作者: Jason Lee

注意

在很多企业部署方案中,需要能够将增量更新发布到已部署的数据库。 替代方法是在每个部署上重新创建数据库,这意味着在现有数据库中丢失任何数据。 使用 Visual Studio 2010 时,建议使用 VSDBCMD 进行增量数据库发布。 但是,下一版本的 Visual Studio 和 Web 发布管道(WPP)将包括支持直接增量发布的工具。

如果在 Visual Studio 2010 中打开 Contact Manager 示例解决方案,则会看到数据库项目包含一个包含四个文件的 Properties 文件夹。

如果在 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 的计算机使用此方法,并且开发人员需要知道并为所有目标环境提供连接字符串和凭据。
  • 可以使用 Internet Information Services (IIS) Web 部署工具(Web 部署)将 数据库部署为 Web 应用程序项目的一部分。 但是,如果要部署数据库项目,而不是简单地在目标服务器上复制现有本地数据库,此方法会更加复杂。 可以将 Web 部署配置为运行数据库项目生成的 SQL 部署脚本,但为此,需要为 Web 应用程序项目创建自定义 WPP 目标文件。 这为部署过程增加了大量复杂性。 此外,Web 部署不支持对现有数据库的增量更新。 有关此方法的详细信息,请参阅 将 Web 发布管道扩展到包数据库项目部署的 SQL 文件
  • 可以使用 VSDBCMD 实用工具通过数据库架构或部署清单来部署数据库。 可以从 MSBuild 目标调用VSDBCMD.exe,这样就可以将数据库作为较大脚本化部署过程的一部分发布。 可以从 VSDBCMD 命令替代 .sqlcmdvars 文件中的变量和许多其他数据库属性,这样就可以在不创建多个生成配置的情况下为不同环境自定义部署。 VSDBCMD 提供区分功能,这意味着它只会进行必要的更改,使目标数据库与数据库架构保持一致。 VSDBCMD 还提供各种命令行选项,可让你对部署过程进行精细控制。

在此概述中,可以看到将 VSDBCMD 与 MSBuild 结合使用是最适合典型企业部署方案的方法:

支持 Visual Studio 2010 Web Deploy 2.0 VSDBCMD.exe
支持远程部署?
支持增量更新? No
支持部署前/部署后脚本?
支持多环境部署? 有限 受限制
支持脚本化部署? 受限

本主题的其余部分介绍了将 VSDBCMD 与 MSBuild 配合使用来部署数据库项目。

了解部署过程

使用 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: [属性名称]语法设置各种部署属性,并重写 .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 中数据库项目的生成和部署过程。 它还介绍了如何将VSDBCMD.exe与 MSBuild 配合使用来支持企业级数据库部署。

有关实际工作原理的详细信息,请参阅 为多个环境自定义数据库部署。

深入阅读

有关如何通过为每个环境创建单独的部署配置文件来自定义数据库部署的信息,请参阅 为多个环境自定义数据库部署。 有关如何通过运行部署后脚本配置数据库角色成员身份的指导,请参阅 将数据库角色成员身份部署到测试环境。 有关管理成员身份数据库施加的一些独特挑战的指导,请参阅 将成员身份数据库部署到企业环境

有关 MSDN 的这些主题提供有关 Visual Studio 数据库项目和数据库部署过程的广泛指导和背景信息: