作者: 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) 服务和数据库项目。
这些教程的核心部署方法基于 “了解项目文件”中所述的拆分项目文件方法,其中生成过程由两个项目文件控制,一个包含应用于每个目标环境的生成指令,另一个包含特定于环境的生成和部署设置。 在构建时,环境特定的项目文件会被合并到与环境无关的项目文件中,从而形成一整套完整的构建指令。
任务概述
本主题假定:
若要创建支持在目标环境之间改变数据库部署属性的部署系统,需要:
- 为每个目标环境创建部署配置 (.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 类型 | 假 | 假 | 假 |
注释
有关数据库部署属性和环境注意事项的详细信息,请参阅 数据库项目设置概述、 如何:配置部署详细信息的属性、 将数据库生成和部署到独立开发环境,以及 生成数据库并将其部署到过渡环境或生产环境。
若要支持将数据库项目部署到多个目标,应为每个目标环境创建部署配置文件。
创建特定于环境的配置文件
在 Visual Studio 2010 的 “解决方案资源管理器” 窗口中,右键单击数据库项目,然后单击“ 属性”。
在“数据库项目属性”页上的“ 部署 ”选项卡上的 “部署配置文件 ”行中,单击“ 新建”。
在“ 新建部署配置文件 ”对话框中,为文件指定有意义的名称(例如 TestEnvironment.sqldeployment),然后单击“ 保存”。
在 [Filename].sqldeployment 页上,设置部署属性以匹配目标环境的要求,然后保存文件。
请注意,新文件将添加到数据库项目中的“属性”文件夹中。
在 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 的以下文章提供有关数据库部署的更常规指南: