部署数据库项目

作者 :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 部署数据库项目?

部署数据库项目的方法有多种。 但是,并非所有方案都适合将数据库项目部署到企业环境中的远程服务器。 考虑需要从数据库项目部署中获取的内容。 在企业部署方案中,可能需要:

  • 能够从远程位置部署数据库项目。
  • 对现有数据库进行增量更新的功能。
  • 包含部署前脚本或部署后脚本的功能。
  • 为多个目标环境定制部署的能力。
  • 能够将数据库项目部署为更大的(通常是脚本化的单步解决方案部署)的一部分。

可以使用三种main方法来部署数据库项目:

  • 可以在 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
是否支持远程部署?
是否支持增量更新?
是否支持部署前/部署后脚本?
是否支持多环境部署? 有限 受限制
是否支持脚本化部署? 受限制

本主题的其余部分介绍如何将 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:[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>

此属性的值是根据数据库项目的属性设置的。 如果将 Deploy 操作 设置为 创建部署脚本 (.sql) ,则该值将为 False。 如果将 Deploy 操作 设置为 创建部署脚本 (.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 数据库项目和数据库部署过程的更广泛的指导和背景信息: