通过


为多个环境自定义数据库部署

作者: Jason Lee

本主题介绍如何在部署过程中将数据库的属性定制到特定目标环境。

注释

本主题假定你正在使用 MSBuild.exe 和 VSDBCMD.exe部署 Visual Studio 2010 数据库项目。 有关如何选择此方法的详细信息,请参阅 企业中的 Web 部署部署数据库项目

将数据库项目部署到多个目标时,通常需要为每个目标环境自定义数据库部署属性。 例如,在测试环境中,通常会在每个部署上重新创建数据库,而在过渡或生产环境中,更有可能进行增量更新来保留数据。

在 Visual Studio 2010 数据库项目中,部署设置包含在部署配置 (.sqldeployment) 文件中。 本主题介绍如何创建特定于环境的部署配置文件,并指定要用作 VSDBCMD 参数的部署配置文件。

本主题构成了一系列教程的一部分,这些教程基于名为 Fabrikam, Inc 的虚构公司的企业部署要求。本教程系列使用示例解决方案( 联系人管理器解决方案)来表示具有现实复杂性级别的 Web 应用程序,包括 ASP.NET MVC 3 应用程序、Windows Communication Foundation (WCF) 服务和数据库项目。

这些教程的核心部署方法基于 “了解项目文件”中所述的拆分项目文件方法,其中生成过程由两个项目文件控制,一个包含应用于每个目标环境的生成指令,另一个包含特定于环境的生成和部署设置。 在构建时,环境特定的项目文件会被合并到与环境无关的项目文件中,从而形成一整套完整的构建指令。

任务概述

本主题假定:

  • 使用拆分项目文件方法进行解决方案部署,如 了解项目文件中所述。
  • 从项目文件调用 VSDBCMD 以部署数据库项目,如 了解生成过程中所述。

若要创建支持在目标环境之间改变数据库部署属性的部署系统,需要:

  • 为每个目标环境创建部署配置 (.sqldeployment) 文件。
  • 创建将部署配置文件指定为命令行开关的 VSDBCMD 命令。
  • 在Microsoft生成引擎(MSBuild)项目文件中参数化 VSDBCMD 命令,以便 VSDBCMD 选项适用于目标环境。

本主题将介绍如何执行上述每个过程。

创建环境特定的部署配置文件

默认情况下,数据库项目包含名为 Database.sqldeployment 的单个部署配置文件。 如果在 Visual Studio 2010 中打开此文件,可以看到可用的不同部署选项:

  • 部署比较汇总。 这允许你选择是使用项目( 排序规则)的数据库排序规则还是目标服务器( 目标 排序规则)的数据库排序规则。 在大多数情况下,当您部署到开发或测试环境时,您会希望使用源排序规则。 部署到过渡或生产环境时,通常需要将目标排序规则保持不变,以避免任何互操作性问题。
  • 部署数据库属性。 这允许你选择是否应用 Database.sqlsettings 文件中定义的数据库属性。 首次部署数据库时,应部署数据库属性。 如果要更新现有数据库,则属性应已到位,并且无需再次部署它们。
  • 始终重新创建数据库。 这使您可以选择每次部署时,是否重新创建目标数据库,或进行增量更改以使目标数据库与您的架构保持同步。 如果重新创建数据库,则会丢失现有数据库中的任何数据。 因此,对于部署到过渡环境或生产环境,通常应将其设置为 false
  • 如果可能发生数据丢失,则阻止增量部署。 这样,你可以选择如果更改数据库架构会导致数据丢失,则部署是否应停止。 对于部署到生产环境,通常将此设置为 true ,让你有机会进行干预和保护任何重要数据。 如果已将 Always re-create 数据库 设置为 false,则此设置将不起作用。
  • 在单用户模式下执行部署。 这通常不是开发或测试环境中的问题。 但是,对于部署到测试环境或生产环境,通常应将其设置为true。 这可以防止用户在部署正在进行时对数据库进行更改。
  • 在部署之前备份数据库。 部署到生产环境时,通常将此设置为 true ,作为防止数据丢失的预防措施。 如果暂存数据库包含大量数据,则还可能需要在部署到过渡环境时将其设置为 true
  • 为目标数据库中但不在数据库项目中的对象生成 DROP 语句。 在大多数情况下,这是对数据库进行增量更改不可或缺的基本部分。 如果已将 Always re-create 数据库 设置为 false,则此设置将不起作用。
  • 请勿使用 ALTER ASSEMBLY 语句更新 CLR 类型。 此设置确定 SQL Server 应如何将公共语言运行时 (CLR) 类型更新为较新的程序集版本。 在大多数情况下,这应设置为 false

下表显示了不同目标环境的典型部署设置。 但是,你的设置可能有所不同,具体取决于具体的要求。

开发人员/测试 过渡/集成 生产
部署比较整理 来源 目标 目标
部署数据库属性 为真 仅限首次 仅限首次
始终重新创建数据库 为真
如果可能发生数据丢失,则阻止增量部署 可能 为真
在单用户模式下执行部署脚本 为真 为真
在部署之前备份数据库 可能 为真
为目标数据库中但不在数据库项目中的对象生成 DROP 语句 为真 为真
请勿使用 ALTER ASSEMBLY 语句更新 CLR 类型

若要支持将数据库项目部署到多个目标,应为每个目标环境创建部署配置文件。

创建特定于环境的配置文件

  1. 在 Visual Studio 2010 的 “解决方案资源管理器” 窗口中,右键单击数据库项目,然后单击“ 属性”。

  2. 在“数据库项目属性”页上的“ 部署 ”选项卡上的 “部署配置文件 ”行中,单击“ 新建”。

    在“数据库项目属性”页上的“部署”选项卡上的“部署配置文件”行中,单击“新建”。

  3. 在“ 新建部署配置文件 ”对话框中,为文件指定有意义的名称(例如 TestEnvironment.sqldeployment),然后单击“ 保存”。

  4. [Filename].sqldeployment 页上,设置部署属性以匹配目标环境的要求,然后保存文件。

    在 Filename .sqldeployment 页上,设置部署属性以符合目标环境的要求,然后保存文件。

  5. 请注意,新文件将添加到数据库项目中的“属性”文件夹中。

    请注意,新文件将添加到数据库项目中的“属性”文件夹中。

在 VSDBCMD 中指定部署配置文件

在 Visual Studio 2010 中使用解决方案配置(如调试和发布)时,可以将部署配置文件与每个配置相关联。 生成特定配置时,生成过程将生成一个特定于配置的部署清单文件,该文件指向特定于配置的部署配置文件。 但是,这些教程中介绍的部署方法的主要目的之一是让用户能够在不使用 Visual Studio 2010 和解决方案配置的情况下控制部署过程。 在此方法中,无论目标部署环境如何,解决方案配置都是相同的。 若要根据特定的目标环境定制数据库部署,可以使用 VSDBCMD 命令行选项指定部署配置文件。

若要在 VSDBCMD 中指定部署配置文件,请使用 p:/DeploymentConfigurationFile 开关并提供文件的完整路径。 这将替代部署清单标识的部署配置文件。 例如,可以使用此 VSDBCMD 命令将 ContactManager 数据库部署到测试环境:

vsdbcmd.exe /a:Deploy
            /manifest:"…\ContactManager.Database.deploymanifest"
            /cs:"Data Source=TESTDB1;Integrated Security=true"
            /p:TargetDatabase=ContactManager
            /p:DeploymentConfigurationFile=
              "…\ContactManager.Database_TestEnvironment.sqldeployment"
            /dd+
            /script:"…\Publish-ContactManager-Db.sql"

注释

请注意,生成过程可能会在将文件复制到输出目录时重命名 .sqldeployment 文件。

如果在部署前或部署后 SQL 脚本中使用 SQL 命令变量,则可以使用类似的方法将特定于环境的 .sqlcmdvars 文件与部署相关联。 在这种情况下,可以使用 p:/SqlCommandVariablesFile 开关来标识 .sqlcmdvars 文件。

从 MSBuild 项目文件运行 VSDBCMD 命令

可以使用 MSBuild 目标中的 Exec 任务从 MSBuild 项目文件调用 VSDBCMD 命令。 最简单的形式如下所示:

<Target Name="DeployDatabase">     
   <PropertyGroup>      
      <_Cmd>
         Add your VSDBCMD command here
      </_Cmd>
   </PropertyGroup>
   <Exec Command="$(_Cmd)"/> 
 </Target>
  • 在实践中,若要使项目文件易于读取和重用,需要创建属性来存储各种命令行参数。 这使用户能够更轻松地在特定于环境的项目文件中提供属性值,或者重写 MSBuild 命令行中的默认值。 如果使用 “了解项目文件”中所述的拆分项目文件方法,则应相应地在两个文件之间划分生成说明和属性:
  • 特定于环境的设置(如部署配置文件名、数据库连接字符串和目标数据库名称)应位于特定于环境的项目文件中。
  • 运行 VSDBCMD 命令的 MSBuild 目标以及任何通用属性(如 VSDBCMD 可执行文件的位置)都应位于通用项目文件中。

还应确保在调用 VSDBCMD 之前生成数据库项目,以便创建 .deploymanifest 文件并准备好使用。 可以在“ 了解生成过程”主题中看到此方法的完整示例,该示例将引导你完成 Contact Manager 示例解决方案中的项目文件。

结束语

本主题介绍了在使用 MSBuild 和 VSDBCMD 部署数据库项目时如何为不同的目标环境定制数据库属性。 如果需要将数据库项目部署为更大的企业级解决方案的一部分,此方法非常有用。 这些解决方案通常部署到多个目标,例如沙盒开发或测试环境、过渡或集成平台以及生产或实时环境。 每个目标环境通常需要一组唯一的数据库部署属性。

深入阅读

有关使用 VSDBCMD.exe部署数据库项目的详细信息,请参阅 “部署数据库项目”。 有关使用自定义 MSBuild 项目文件控制部署过程的详细信息,请参阅了解项目文件和了解生成过程

有关 MSDN 的以下文章提供有关数据库部署的更常规指南: