数据库生成和部署概述

更新:2007 年 11 月

要将新数据库或现有数据库的更改从数据库项目部署到数据库服务器上,必须生成数据库项目,然后将它部署到数据库服务器上。生成步骤通过使用您在项目属性窗口中设置的属性,将对象定义脚本和任何预先部署或后期部署脚本汇编成单个生成脚本。部署步骤汇编该脚本,随后依据所指定的目标执行生成脚本。清除生成操作只是删除现有的生成脚本。如果打算更新测试服务器或成品服务器,可以先生成数据库项目,然后自己修改生成脚本。在进行调整之后,如果对结果感到满意,可以将修改后的生成脚本手动部署到生产环境中。

部署脚本

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

可以针对不同的目标数据库运行生成脚本,而且每个目标数据库可以有不同的配置。因此,生成脚本中必须包含用来设置所有数据库属性的语句,即使它们的值已经与数据库项目属性的值相匹配也是如此。

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

在将更改部署到现有数据库时,有些更改可能会导致数据丢失。如果此更改将导致表中所包含的数据丢失,那么,除非您在项目属性窗口中清除了“如果可能发生数据丢失则阻止增量部署”复选框,否则部署将被取消。有关更多信息,请参见数据库项目设置概述。例如,以下更改会导致数据丢失:删除或重新创建表,更改列的大小(从 char(100) 更改为 char(50) 或者从 nchar(100) 更改为 char(100)),或者更改字符类型列的排序规则。

从失败的部署中恢复

Team Edition for Database Professionals 会在事务日志中创建一个保存点,并且可以在部署失败时恢复到保存点。但是,在部署期间,如果数据库中的数据在保存点创建之后、数据库得以恢复之前进行了修改,则数据可能会丢失。因此,如果要部署到共享数据库,则一定要考虑先将数据库置于单用户模式,然后再部署它。

说明:

必须使用完全恢复模型来从失败的部署中还原数据库。简单恢复模型是不够的,因为需要使用事务日志。有关恢复模型的更多信息,请参见 Overview of the Recovery Models(恢复模型概述)。

排除的文件

如果从数据库项目中排除了文件,那么,在这些文件中定义的数据库对象将不会包括在生成或部署中。如果您还在处理一个或多个对象,但同时希望部署已经完成的工作,可以排除文件,以便只部署那些已就绪的项目。以后在这些文件已就绪而能够部署时,可以将它们包括进来,部署过程将用新对象更新数据库,而不修改现有的对象(如果它们尚未在项目中更改)。

命令行生成

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

重要说明:

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

命令行语法

可以使用浅显的语法从命令行生成数据库项目,如下面的示例所示:

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

  • MSBuild /target:SQLBuild 我的项目名称.dbproj
    此示例还将执行一个仅生成操作。它只生成名为 我的项目名称.dbproj 的单个数据库项目。.dbproj 文件中的项目属性用于汇编生成脚本。该脚本不会部署。SQLBuild 目标不在所生成的生成脚本中包括预先部署脚本或后期部署脚本。

  • MSBuild /target:Build /p:BuildScriptName=MyScriptName.sql 我的项目名称.dbproj
    此示例还将执行一个仅生成操作。它只生成名为 我的项目名称.dbproj 的单个数据库项目。.dbproj 文件中的项目属性用于汇编生成脚本。该命令行重写**“生成脚本名称”**属性并为输出脚本指定一个新名称。如果希望将生成脚本部署到多台服务器,则可以使用此方法。该脚本不会部署。

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

  • MSBuild /target:rebuild /p:Configuration="Default" /p:DefaultDataPath="驱动器:路径\\" MyProjectName.dbproj
    此示例演示如何重新生成数据库项目,指定配置(默认值)并重写 DefaultDataPath 变量。

重要说明:

必须为 DefaultDataPath 指定额外的尾部反斜杠(“\”)。否则,生成时将出现警告,并且数据库项目不会正确生成。

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

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

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

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

说明:

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

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

有关响应文件的更多信息,请参见 MSBuild Response

说明:

要运行 MSBuild.exe,必须使用 Visual Studio 2005 命令提示窗口,或者运行 vsvars32.bat 批处理文件,该文件位于 %VS80COMNTOOLS% 环境变量所指定的文件夹中。

数据库项目属性

某些数据库项目属性会影响数据库项目的生成和部署方式。这些属性存储在数据库项目文件和 .user 文件中,您可以在命令行或响应文件中重写它们。有关数据库项目属性的更多信息,请参见数据库项目设置概述

安全注意事项

如果其他用户可以修改设计时验证数据库的实例,则他们可能添加或更改将在生成脚本中结束的对象。生成输出将生成这些对象(例如,DDL 触发器),而且这些对象将在数据库部署者的上下文中运行。这些对象不一定出现在“解决方案资源管理器”或“架构视图”中。当您将数据库项目与所部署的数据库进行比较时,“架构比较”功能将检测不到任何区别,因为设计时验证数据库中也包含这些对象。

要尽可能降低数据库的风险,应注意以下两点:

  • 不要与其他用户共享设计时验证数据库的实例。

  • 在部署生成脚本之前对它们进行检查。

请参见

任务

如何:准备数据库生成脚本

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

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

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

概念

Database Edition 术语概述