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

作者 :Jason Lee

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

注意

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

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

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

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

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

任务概述

本主题假定:

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

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

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

本主题将演示如何执行其中每个过程。

创建Environment-Specific部署配置文件

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

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

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

开发人员/测试 暂存/集成 生产
部署比较排序规则 目标 目标
部署数据库属性 True 仅限第一次 仅限第一次
始终重新创建数据库 True False False
如果可能发生数据丢失则阻止增量部署 False 可能 True
在单用户模式下执行部署脚本 False True True
部署前备份数据库 False 可能 True
为目标数据库中但不在数据库项目中的对象生成 DROP 语句 False True True
不使用 ALTER ASSEMBLY 语句更新 CLR 类型 False False False

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

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

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

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

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

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

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

    在“文件名 .sqldeployment”页上,设置部署属性以匹配目标环境的要求,然后保存该文件。

  5. 请注意,新文件已添加到数据库项目中的 Properties 文件夹中。

    请注意,新文件已添加到数据库项目中的 Properties 文件夹中。

在 VSDB 中指定部署配置文件CMD

在 Visual Studio 2010 中使用解决方案配置 ((如调试和发布) )时,可以将部署配置文件与每个配置相关联。 生成特定配置时,生成过程会生成一个特定于配置的部署清单文件,该文件指向特定于配置的部署配置文件。 但是,这些教程中所述的部署方法main目标之一是让用户能够在不使用 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 上的以下文章提供了有关数据库部署的更多常规指南: