数据库生成和部署概述

更新:2010 年 7 月

若要创建数据库或将现有数据库的更新从数据库项目发布到数据库服务器,必须生成数据库项目,然后将它部署到该服务器。

生成步骤将数据库项目编译到用于部署的文件中。 这些文件包括 .dbschema 文件、.deploymentmanifest 文件和预先部署和后期部署脚本。 在生成数据库项目时,不会与目标数据库进行比较。 部署数据库项目时,系统会比较生成操作的输出和目标数据库(如果存在),并会标识更新目标以匹配数据库项目所必需的操作。 这些更新将根据您的设置部署到目标数据库。

或者,您也可以生成并修改部署脚本(.SQL 文件),然后使用**“Transact-SQL 编辑器”**或其他工具(如 SQL Server Management Studio)将其部署到临时或成品服务器。 清理生成操作将删除任何现有的生成项目,例如,脚本、部署清单和 .dbschema 文件。

部署脚本

可以创建在创建或更新目标的脚本之前或之后运行的脚本。 只能有一个预先部署脚本和一个后期部署脚本,但是可以在这些脚本中包括其他脚本。 有关更多信息,请参见创建和修改数据库脚本

部署清单

在生成数据库项目时,将生成一个部署清单。 该清单包含所有项目级配置信息,要想能够在同时无需数据库项目文件 (.dbproj) 的情况下进行部署,这些信息是必需的。

部署清单文件 (.deploymanifest) 是一个 XML 文件,其结构与 MSBuild 项目文件非常相似。 .deploymanifest 文件在数据库项目文件夹的 sql\配置 文件夹中创建,其中配置 是生成配置,例如 debug 或 release。

下例所示为空 SQL Server 2008 数据库项目 Empty2008DbProj 的 .deploymanifest 文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <TargetConnectionString>Data Source=stevenpoauth\sql2k8;Integrated Security=True;Pooling=False</TargetConnectionString>
    <TargetDatabase>Empty2008DbProj</TargetDatabase>
    <DeployToDatabase>True</DeployToDatabase>
    <DeployToScript>True</DeployToScript>
    <SourceModel>Empty2008DbProj.dbschema</SourceModel>
    <DeployScriptFileName>Empty2008DbProj.sql</DeployScriptFileName>
    <DeploymentConfigurationFile>Empty2008DbProj_Database.sqldeployment</DeploymentConfigurationFile>
  </PropertyGroup>
  <PropertyGroup>
    <SqlCommandVariablesFile>Empty2008DbProj_Database.sqlcmdvars</SqlCommandVariablesFile>
  </PropertyGroup>
  <ItemGroup>
    <DeploymentExtensionConfiguration Include="Empty2008DbProj_Script.PostDeployment.sql">
      <__PostdeploymentMetadata>
      </__PostdeploymentMetadata>
    </DeploymentExtensionConfiguration>
    <DeploymentExtensionConfiguration Include="Empty2008DbProj_Script.PreDeployment.sql">
      <__PredeploymentMetadata>
      </__PredeploymentMetadata>
    </DeploymentExtensionConfiguration>
  </ItemGroup>
  <ItemGroup>
    <DeploymentExtension Include="Microsoft.Data.Schema.Sql.Build.SqlPlanOrderModifier">
      <Assembly>Microsoft.Data.Schema.Sql</Assembly>
      <Version>10.0.0.0</Version>
      <Token>sD9ffxHVCjo=</Token>
    </DeploymentExtension>
    <DeploymentExtension Include="Microsoft.Data.Schema.Sql.Build.SqlPrePostDeploymentModifier">
      <Assembly>Microsoft.Data.Schema.Sql</Assembly>
      <Version>10.0.0.0</Version>
      <Token>sD9ffxHVCjo=</Token>
    </DeploymentExtension>
    <DeploymentExtension Include="Microsoft.Data.Schema.Sql.Refactoring.SqlRefactoringDeploymentContributor">
      <Assembly>Microsoft.Data.Schema.Sql</Assembly>
      <Version>10.0.0.0</Version>
      <Token>sD9ffxHVCjo=</Token>
    </DeploymentExtension>
  </ItemGroup>
</Project>

部署清单文件包含一个或多个 PropertyGroup 节点,用于定义部署时所使用的默认配置。 部署清单文件还包含 ItemGroup 节点,其中包括 DeploymentExtensionConfiguration 节点和 Reference 节点。

DeploymentExtensionConfiguration 节点定义部署时传递到部署扩展的配置文件。 这些配置文件包括预先部署和后期部署脚本,以及用于保留部署时的意图的重构日志。

Reference 节点定义由项目引用且在生成该项目时复制到输出文件夹的任何项目。 引用文件在部署时进行处理,以确保已正确重新创建数据库模型。

部署脚本中的事务

部署脚本中的大多数数据库更改都在事务内发生,以便可以在部署失败时回滚这些更改。 但是,下列对象在部署事务外创建、更新或删除。

SQL Server 版本

部署事务外的对象

SQL Server 2008 

服务器角色成员资格

终结点

全文索引

全文目录

链接服务器

链接服务器登录

事件会话

服务器审核规范

全文非索引字表

SQL Server 2005

服务器角色成员资格

终结点

全文索引

全文目录

链接服务器

链接服务器登录

通常这些对象使用系统存储过程进行维护,因此必须位于部署事务外。

将更改部署到现有数据库时的注意事项

在将更改部署到现有数据库时,有些更改可能会导致数据丢失。 如果某一更改可能导致表中的数据丢失,选中**“如果可能发生数据丢失则阻止增量部署”**复选框时将取消部署。 默认情况下,该复选框处于选中状态,但是您可以在项目的“属性”窗口中找到该复选框。 有关更多信息,请参见数据库项目设置概述

以下更改类型会导致数据丢失:删除或重新创建表,更改列的大小(从 char(100) 更改为 char(50) 或者从 nchar(100) 更改为 char(100)),或者更改具有某种字符类型的列的排序规则。

提示

当使用重构功能重命名数据库对象或将数据库对象移至其他架构时,重构日志文件将记录该操作。 在部署时,日志文件中的信息有助于保留更改的意图。 例如,如果对某个表进行重命名,则可能会丢失数据,这是因为该表将被删除,并将使用一个新名称来创建表。 借助重构日志文件,部署脚本可以对表进行重命名,从而保留您的意图和数据。

从失败的部署中恢复

如果您的部署在部署脚本的事务处理部分之外失败,则会丢失数据。 因此,请务必考虑先将共享数据库置于单用户模式下并进行备份,然后再进行部署。

排除的文件

如果从数据库项目中排除了文件,那么,在这些文件中定义的数据库对象将不会包括在生成数据库项目时创建的 .dbschema 文件中。 由于这些对象未包括在 .dbschema 文件中,因此将不会部署这些对象。 如果您还在处理一个或多个对象,但希望部署已经完成的工作,则可以从生成中排除某些文件,以便只将已就绪的对象包括在 .dbschema 文件中并部署到目标数据库。 以后在这些文件已就绪而能够部署时,可以将它们包括进来,部署过程将用新对象更新数据库,而不修改现有的对象(如果它们尚未在项目中更改)。 有关更多信息,请参见如何:从数据库项目中排除文件

重要说明重要事项

如果从目标数据库中存在的数据库项目中排除对象,然后再部署该项目,则可能会丢失数据。 如果在部署配置中选中了“为目标数据库中存在而数据库项目中不存在的对象生成 DROP 语句”复选框,将会从目标数据库中删除这些对象。

服务器项目

服务器项目包含“master”数据库中的对象的定义。 服务器项目的目标数据库名称始终为“master”。 对于每一服务器设置,可以指定是否希望在部署服务器项目时验证该设置的值。 未验证的设置将被忽略。 如果服务器设置的值与要验证的设置的值不匹配,部署将失败并显示一条错误消息。

命令行生成

除了从 Visual Studio 用户界面内执行生成、部署或清除操作之外,还可以使用 MSBuild.exe 在命令提示符下执行这些操作。 可以指定 Build、Deploy、Rebuild 和 Clean 目标。 默认情况下,生成过程和部署过程使用在数据库项目(.dbproj 文件或 .dbproj.user 文件)中定义的项目属性。 但是,可以在命令提示符下或者从响应文件中重写这些属性。

重要说明重要事项

在执行命令行生成之前应当先关闭 Visual Studio。 如果在 Visual Studio 正在运行时执行命令行生成,可能捕获不到某些错误。

您还可以使用 VSDBCMD.EXE 从命令提示符处部署 .dbschema 文件。 可以在未安装 Visual Studio 的计算机上使用 VSDBCMD。 有关更多信息,请参见如何:准备数据库以使用 VSDBCMD.EXE 从命令提示符处进行部署。 若要部署到生产环境,您可以使用 VSDBCMD,也可以先生成一个部署脚本,然后使用**“Transact-SQL 编辑器”**或其他工具(如 SQL Server Management Studio)手动部署该脚本。

命令行语法

可以使用以下语法示例在命令提示符下生成数据库项目:

  • MSBuild /target:Build 我的解决方案名称.sln
    此示例通过使用项目属性来针对名为 我的解决方案名称.sln 的解决方案执行生成操作,这些项目属性是在该解决方案所包含的项目文件中指定的。 如果该解决方案中包含多个数据库项目,那么,这些数据库项目将与该解决方案中的其他任何内容一起生成。 还可以生成特定的数据库项目。 Build 目标在所生成的生成脚本中包括预先部署脚本和后期部署脚本。

  • MSBuild /target:Deploy /p:UseSandboxSettings=false /p:TargetDatabase=UpdatedTargetDatabase;TargetConnectionString="Data Source=(local)\SQLEXPRESS;Integrated Security=True;Pooling=False" 我的项目名称.dbproj
    此示例演示如何部署数据库项目,并重写目标数据库名称和连接字符串。

  • MSBuild /target:Deploy /p:UseSandboxSettings=false /p:DeploymentConfiguration=部署路径\备用部署配置.deploymentconfig /p:SqlCommandVarsFile=变量路径\备用变量.sqlcmdvars /p:TargetDatabase=UpdatedTargetDatabase;TargetConnectionString="Data Source=(local)\SQLEXPRESS;Integrated Security=True;Pooling=False" 我的项目名称.dbproj
    此示例演示如何部署数据库项目,指定不同目标数据库和连接字符串,并重写部署配置和部署变量。

  • MSBuild /target:Deploy /p:UseSandboxSettings=false /p:BuildScriptName=我的脚本名称.sql /p:outdir=生成脚本的路径 /p:TargetDatabase=已更新的目标数据库;TargetConnectionString="Data Source=实例名称\数据库名称;Integrated Security=True;Pooling=False" 项目路径\我的项目名称.dbproj
    下面的示例演示如何从执行生成操作的计算机以外的计算机部署数据库。 例如,如果您有一台在每天晚上创建生成脚本的集中生成计算机,则可以使用此语法。 必须指定生成脚本的名称、生成脚本所在的路径 (outdir)、目标数据库以及数据库项目的路径和文件名。

  • MSBuild @dbbuild.arf 我的项目名称.dbproj
    此示例演示如何使用响应文件来提供命令行参数。 dbbuild.arf 文件可以包含 MSBuild 的任何有效参数,其中包括重写项目属性的参数。

  • MSBuild /target:Rebuild 我的项目名称.dbproj
    此示例重新生成指定的项目或解决方案,即使它在上次生成之后未发生更改也是如此。

  • MSBuild /target:Clean 我的项目名称.dbproj
    此示例演示如何删除任何现有的生成脚本。 在大多数情况下,您应在执行此操作之后执行另一个生成或部署操作。

提示

可以将 /target: 简写为 /t:,将 /property: 简写为 /p:。

有关更多信息,请参见 MSBuild 命令行参考

有关响应文件的更多信息,请参见 Microsoft 网站上的此主题:MSBuild Response Files(MSBuild 响应文件)。

提示

若要运行 MSBuild.exe,必须使用 Visual Studio 命令提示符,或者必须运行 vsvars32.bat 批处理文件。 您可以在 %VS80COMNTOOLS% 环境变量指定的文件夹中找到此批处理文件。

生成计算机上的必需软件

Visual Studio Team Foundation Server 2010 本身支持生成、部署、单元测试以及为数据库项目生成数据。 您无需在生成计算机上安装 Visual Studio。 如果您不打算在生成计算机上使用 Visual Studio Team Foundation Server 2010,则必须在其上安装 Visual Studio 2010 专业版、Visual Studio 2010 高级专业版或 Visual Studio 2010 旗舰版。

另外,如果您希望从 Team Foundation Build 部署数据库,而不是将数据库作为数据库单元测试的一部分进行部署,则必须执行附加安装。 您必须将 %PROGRAM FILES%\Microsoft Visual Studio 10.0\VSTSDB\Deploy 文件夹及其内容(包括子文件夹)从 Visual Studio 2010 安装复制到生成计算机。 有关更多信息,请参见如何:使用 Team Foundation Build 部署更改演练:定义自定义的工作流以从 Team Foundation Build 部署数据库

项目属性

数据库和服务器项目的某些属性会影响这些项目的生成和部署方式。 这些属性存储在项目文件和 .user 文件中,但是您可以在命令提示符下或响应文件中重写它们。 有关更多信息,请参见如何:为数据库和服务器项目配置生成设置如何:为数据库和服务器项目配置部署设置

重写部署清单属性

从命令行部署时,可以重写默认部署属性(例如,部署配置、连接字符串或 SQLCMD 变量)。 如果要将 .dbschema 文件部署到多个环境中,则可以选择这样做。

例如,如果要将在 EnterpriseDB.dbproj 中定义的架构部署到开发、测试和生产环境中,可以使用以下命令行:

部署环境

MSBuild EnterpriseDB.dbproj /t:Deploy /p:UseSandboxSettings=false /p:DeploymentConfigurationFile=sql\debug\Development.sqldeployment /p:SqlCommandVariablesFile=sql\debug\Development.sqlcmdvars /p:TargetConnectionString="Data Source=DEV\sql2008;Integrated Security=true;Pooling=false"

测试环境

MSBuild EnterpriseDB.dbproj /t:Deploy /p:UseSandboxSettings=false /p:DeploymentConfigurationFile=sql\debug\UserTest.sqldeployment /p:SqlCommandVariablesFile=sql\debug\UserTest.sqlcmdvars /p:TargetConnectionString="Data Source=USERTEST\sql2008;Integrated Security=true;Pooling=false"

生产环境

MSBuild EnterpriseDB.dbproj /t:Deploy /p:UseSandboxSettings=false /p:DeploymentConfigurationFile=sql\debug\Production.sqldeployment /p:SqlCommandVariablesFile=sql\debug\Production.sqlcmdvars /p:TargetConnectionString="Data Source=PRODUCTION\sql2008;Integrated Security=true;Pooling=false"

在每个环境中,您应提供不同的部署配置文件、不同的 SQLCMD 变量文件和不同的连接字符串。

请参见

任务

如何:生成数据库项目以生成经过编译的架构 (.dbschema) 文件

如何:将更改部署到新数据库或现有数据库

演练:创建和部署受版本控制的新数据库

演练:将更改部署到受版本控制的现有数据库

概念

生成数据库并将其部署到独立开发环境中

生成数据库并将其部署到临时或生产环境中

修订记录

日期

修订记录

原因

2010 年 7 月

阐明了需要在生成计算机上安装的软件,以消除用户在 MSDN 论坛上提出的困惑。

客户反馈