比较和同步数据库架构

更新:2010 年 6 月

本主题适用于:

Visual Studio 旗舰版

Visual Studio 高级专业版

Visual Studio 专业版 

Visual Studio 学习版

主题适用 主题适用 主题不适用 主题不适用

可以使用 Visual Studio 高级专业版或 Visual Studio 旗舰版将目标架构与源架构进行比较。 对于每项差别,您可以指定是否更新目标以使其与源匹配。 可以将这些更新直接写入目标,也可以将更新脚本导出到 Transact-SQL 编辑器或某个文件。 还可以将比较另存为数据库项目的一部分,或另存为一个单独的文件。 通过保存比较,您可以更轻松地重复执行这些比较或重新同步相同的源和目标。

架构比较的类型

可以比较以下包含数据库架构定义的实体:

  • SQL Server 数据库 - 在 SQL Server 2008 或 SQL Server 2005 实例上运行的数据库

  • 数据库项目 - 包含 SQL Server 2008 或 SQL Server 2005 数据库定义且在生成时会生成 .dbschema 文件的项目

  • 服务器项目 - 包含 SQL Server 2008 或 SQL Server 2005 服务器上的服务器对象以及“master”数据库中对象的定义,且在生成时会生成 .dbschema 文件的项目

  • 数据层应用程序组件 (DAC) 项目 - 在生成时会生成 .dacpac 文件的项目

  • .dbschema 文件 - 生成数据库项目或服务器项目时的输出

  • .dacpac 文件 - 生成数据层应用程序组件 (DAC) 项目时的输出

下表显示了可以比较的架构类型以及是否可以将更新写入目标:

纵向为源,

横向为目标

SQL Server 数据库

数据库项目

.dbschema 文件

服务器项目

DAC 项目

.dacpac 文件

SQL Server 数据库

比较 + 更新

比较 + 更新

比较

比较 + 更新

比较

比较

数据库项目

比较 + 更新

比较 + 更新

比较

.dbschema 文件

比较 + 更新

比较 + 更新

比较

比较 + 更新

服务器项目

比较 + 更新

比较

比较 + 更新

DAC 项目

比较

比较 + 更新

比较

.dacpac 文件

比较

比较 + 更新

比较

若要读取此表,在最左侧列中找到源架构所在行。 接下来,在首行找到目标架构所在列。 列与行的相交单元提供您是否只能比较源和目标,还是比较后可选择更新目标架构的相关信息。

无法将服务器架构与数据库架构进行比较,也无法将数据库架构与服务器架构进行比较。 这包括以 .dbschema 文件形式表示的架构。 例如,可以将服务器项目与从服务器项目创建的 .dbschema 文件进行比较。

仅在两个数据库项目包含在 Visual Studio 的同一解决方案中时,才可对它们进行比较。

警告

虽然可以将源数据库与目标数据库项目 (.dbproj) 进行比较,但您还是应先更改数据库项目再将这些更改部署到数据库。 由于项目受到版本控制,在您先更改项目 (.dbproj) 再部署更改时,您的更改与团队中其他成员所做更改发生冲突的风险会有所降低。

防止更新数据库架构时丢失数据

使用架构比较更新数据库架构时,可能会导致数据丢失。 为避免数据丢失,应格外注意源和目标中的对象名称,在更新目标中的架构之前尤其要注意。

例如,您可能已将源数据库中的表“Order_Details”重命名为“OrderDetails”,但未在目标数据库中进行相应更改,然后比较这两个数据库。 在同步这两个数据库之前,两个表中的数据完全相同。 但是,在更新目标后,“Order_Details”表将被删除,同时系统将创建一个“OrderDetails”表。 “Order_Details”表中的数据就会全部丢失。

为防止数据丢失,可以打开**“工具”菜单,单击“选项”,然后选中“如果可能发生数据丢失则阻止架构更新”**复选框。 另外,在将更新写入数据库之前应始终对数据库进行备份。 比较架构时,还可以指定比较选项。 有关更多信息,请参见如何:设置比较数据库架构的选项

重要说明重要事项

如果使用重构来重命名数据库项目中的对象,重构日志也有助于防止在生成和部署数据库时丢失数据。 该日志会保留您的更改意图。 例如,可以就地重命名表。

架构比较和增量部署之间的差异

将更新部署到现有数据库时的进程与使用架构比较同步两个数据库架构时的进程非常相似。 不过,架构比较与前者之间有一点重大差别,那就是:默认情况下,架构比较会忽略扩展属性。

如果不希望忽略扩展属性和权限,可以针对所有架构比较会话或针对当前会话更改架构比较选项。 有关更多信息,请参见如何:设置比较数据库架构的选项

常规任务

在下表中,可以找到支持此方案的常规任务的说明,以及指向有关如何成功完成这些任务的更多信息的链接。

常规任务

支持内容

亲身实践:可以按照介绍性演练操作,熟悉如何比较两个数据库或如何将数据库与项目 (.dbproj) 进行比较。

演练:比较两个数据库的架构

演练:比较数据库的架构和数据库项目的架构

设置相应选项以控制架构的比较方式:可以配置用于控制架构比较方式的详细信息。 可以忽略特定类型的差别,例如,空白、文件组和注释。 还可以忽略对象的类别,例如,用户或登录名。 可以指定用于控制生成的更新脚本的选项。

如何:设置比较数据库架构的选项

比较数据库对象或服务器对象以及(可选)更新目标以使其与源匹配:指定要比较的源架构和目标架构,结果将显示在“架构比较”窗口中。 您不仅可以查看差异的详细信息,还可以查看将用于同步数据库的更新脚本。 可以将每个架构比较保存到项目中,或另存为单独的 .scmp 文件。 可以针对源架构与目标架构之间的每项差别指定操作,然后可以将更新写入目标。 还可以将更新脚本导出到 Transact-SQL 编辑器或某个文件,以便在对目标应用更改之前可以查看更新脚本。

如何:比较数据库架构

了解架构比较结果

排除问题:可以详细了解如何排除在比较和同步数据库架构时可能遇到的常见问题。

架构比较问题的疑难解答

了解架构比较结果

“架构比较”窗口为比较的每个对象显示四列。 下表介绍各列的内容。

状态

  • 相同 - 对象在源架构和目标架构中具有相同的定义且包含相同的对象。

  • 新增 - 对象在源架构中存在,但在目标架构中不存在。

  • 缺少 - 对象在目标架构中存在,但在源架构中不存在。

  • 定义不同 - 对象在源架构和目标架构中具有不同的定义。

  • 依赖项不同 - 对象在源架构和目标架构中具有相同的定义但包含不同的对象。

例如,您可以在源架构中更改某个表定义,但不在目标架构中进行更改,然后比较这两个架构。 这两个表将被标记为“定义不同”,而包含这两个表的架构将被标记为“依赖项不同”

SourceName(源{项目、数据库或项目文件 (.dbschema)})

要比较的源项目、数据库或项目文件的名称。

更新操作

  • 跳过 - 目标架构中的对象将不会更新。 如果对象具有已更改的依赖项,那么该图标将指示应展开此行以查看不同的引用对象。

  • 跳过引用 - 对象存在于被引用的数据库中,无需丢弃或创建。

  • 创建 - 在写入更新或运行更新脚本时将会创建对象。

  • 更新 - 在写入更新或运行更新脚本时,对象定义将相应更新以与源架构相匹配。

  • 删除 - 在写入更新或运行更新脚本时,对象将被从目标架构中移除。

注意注意
默认操作由状态确定。对于状态为“相同”的对象,默认操作为“跳过”,无法更改默认操作。对于状态为“新增”的对象,默认操作为“创建”,但可以将操作指定为“跳过”。对于状态为“缺少”的对象,默认操作为“删除”,但可以将操作指定为“跳过”。对于状态为“定义不同”的对象,默认操作为“更新”,但可以将操作指定为“跳过”。对于状态为“依赖项不同”的对象,默认操作为“跳过”,无法更改默认操作(在这种情况下,对象相同,但它包含新增、缺少或已更改的对象)。

TargetName(目标{项目、数据库或项目文件 (.dbschema)})

要比较的目标项目、数据库或项目文件的名称。

相关方案

修订记录

日期

修订记录

原因

2010 年 6 月

添加了有关如何读取主题中的第一个表的信息,以处理客户反馈。

客户反馈

2010 年 8 月

阐明了只有包含在同一个解决方案中的项目才能进行比较。

客户反馈