架构比较概述

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Microsoft Fabric SQL 数据库

使用架构比较工具可以比较两个数据库定义,其中比较的源和目标可以是连接的数据库、SQL 数据库项目或 .dacpac 文件的任意组合。 比较完成后,比较的结果将显示为一组操作,使目标与源以与源控件差异类似的方式相同。 从架构比较界面中,可以直接更新目标(如果目标为项目或数据库)或生成具有相同效果的更新脚本。

将包和数据库之间的差异作为概念的屏幕截图。

架构比较提供以下功能:

  • 比较两个 dacpac 文件、数据库或 SQL 项目之间的架构。
  • 将结果视为针对目标执行的一组操作,使其与源匹配。
  • 选择性地排除结果中列出的操作。
  • 设置控制比较范围的选项。
  • 将更改直接应用于目标,或生成脚本以稍后应用更改。
  • 保存比较结果。

功能

源和目标之间的差异会在网格中显示以便进行查看。 可以在派生自以下任何一项的数据库模型之间的任一方向进行比较:

  • 连接数据库
  • SQL 数据库项目
  • .dacpac 文件

在架构比较中,可以深入了解并查看结果网格或脚本窗体中的每个差异,其中在每个行级别提供了更改的详细信息。 在更新目标之前,还可以有选择地排除特定差异。 Visual Studio、Azure Data Studio 和命令行中提供了架构比较工具。

架构比较选项

架构比较选项是从 DacFx .NET 库提供的部署选项中提取的。 这些选项包括:

  • 忽略空格
  • 忽略分区方案
  • 忽略列顺序
  • 删除不在源中的索引
  • 阻止可能的数据丢失

还可以配置比较中包含的对象类型。 这些对象包括表、存储过程、索引、权限、用户定义的类型等等。

架构比较文件

架构比较的比较定义可以另存为 .scmp 文件,称为架构比较文件。 此文件在 XML 中存储有关架构比较的信息,并包括:

  • 源和目标连接信息
  • 比较选项
  • 排除的对象类型

可以在 Visual Studio 或 Azure Data Studio 中打开 .scmp 文件,以便以后再次轻松运行同一比较,或与他人共享比较。

启动和使用架构比较

  1. 在 Visual Studio 中的“工具”菜单上,选择“SQL Server”,然后选择“新建架构比较”

    或者,在解决方案资源管理器中右键单击“TradeDev”项目,然后选择“架构比较”。

    “架构比较”窗口随即打开,并且 Visual Studio 会自动为该窗口分配一个名称,如 SqlSchemaCompare1

    紧邻“架构比较”窗口工具栏的下方将显示两个下拉列表菜单,两个菜单之间有一个绿色箭头。 可以使用这两个菜单为比较源和目标选择数据库定义。

  2. 在“选择源”下拉列表中,选择“选择源”,“选择源架构”对话框随即打开。

    如果通过右键单击项目名称打开“架构比较”窗口,则源架构已经填充,可以前进到步骤 4。

    Visual Studio 中的“架构比较源选择”对话框的屏幕截图。

  3. 通过选择“项目”、“数据库”连接或 .dacpac 文件完成架构比较源的选择。 源是要用作目标更改的基础的数据库定义。

  4. 从“架构比较”窗口的“选择目标”下拉列表中,选择“选择目标”,“选择目标架构”对话框随即打开。 通过选择“项目”、“数据库”连接或 .dacpac 文件完成架构比较目标的选择。 目标是要评估的数据库定义,并可能会被应用更改。

  5. 还可以在“架构比较”窗口工具栏中选择“选项”按钮,以指定比较的对象、忽略的差异类型以及其他设置。

  6. 在“架构比较”窗口工具栏上,选择“比较”按钮以开始比较过程。

    在比较完成后,项目和数据库之间的结构差异将显示在该窗口上半部分中的“结果”窗格中。 默认情况下,比较结果将按操作(例如,删除、更改或添加)对所有差异进行分组。 在“结果”窗格中,在数据库定义上有差异的每个数据库对象显示一行。 每一行都标识了源架构和/或目标架构中的对象,以及为使目标对象与源对象相同而将对目标架构执行的操作。 如果已重构某个对象并对其重命名或将其移至新架构,则源名称和目标名称会不同,并且源名称将显示为粗体以突出显示差异。

    Visual Studio 中架构比较界面的屏幕截图,其中比较了数据库与项目。

    默认情况下,结果列表会隐藏在两个架构中相同的对象或无法更新的对象(例如,内置对象)。 你可以在工具栏上选择适当的筛选按钮来显示这些对象。

    若要更改分组首选项,请在工具栏上选择“对结果分组”下拉列表。 选择“类型”以按对象类型(例如,按表、视图或存储过程)对结果进行分组。

  7. 默认情况下,所有差异都包含在“更新目标”操作的范围内。 可以排除你不希望同步的差异。 为此,请取消选中每行中心的“操作”列。 或者,可以在“架构”窗格中右键单击某一行,然后选择“排除”。 该行将立即灰显。在使用架构比较更新目标数据库时,将不认为该行存在任何挂起的更改。

    也可以右键单击某个组行并选择“全部排除”或“全部包含”,此操作等效于取消选中或选中该组中的所有差异。 在按架构对结果进行分组时,这是包含或排除对特定架构做出的所有更改的有用方式。

    如果所排除的行有任何依赖对象(例如,由“视图”行引用的“表”行),则将禁用排除的行,但不会清除其复选框。 取消选中依赖于它的所有行后,禁用的行将处于取消选中状态。 此外,如果重构了某行(重命名或移动到其他架构),则会禁用该行及其任何依赖子行的复选框。

    如果刷新比较,则已选择跳过的那些差异将被忽略。

要更新目标数据库架构,有两个选项。 如果目标为数据库或项目,则可以直接从“架构比较”窗口更新目标;如果目标为数据库或数据库文件,则可以生成更新脚本。 生成的脚本将显示在 Transact-SQL 编辑器中,可以从该编辑器中检查该脚本并针对数据库执行该脚本。

Visual Studio 中的 SDK 式 SQL 项目预览版中尚不提供图形架构比较功能。 使用 Azure Data Studio 比较架构。

注意

Visual Studio Code 中不提供架构比较。 使用 Azure Data Studio 或 Visual Studio 比较架构。

  1. 在命令面板 (ctrl/cmd+shift+P) 中的 Azure Data Studio 中,搜索并选择“架构比较”

    或者,右键单击“数据库项目”视图中的数据库项目或“对象资源管理器”中的数据库,然后选择“架构比较”

    Azure Data Studio 对象资源管理器中架构比较菜单项的屏幕截图。

    此时会打开“架构比较”窗口,并且源或目标可能会基于启动点预设。

    紧邻“架构比较”窗口工具栏的下方将显示两个省略号按钮,两个按钮之间有一个绿色箭头。 可以使用这两个菜单为比较源和目标选择数据库定义。

  2. 为源或目标选择省略号按钮会打开一个对话框,两者都可以在其中更新。 通过选择“项目”、“数据库”连接或 .dacpac 文件完成架构比较源的选择。 源是要用作目标更改的基础的数据库定义。 目标是要评估的数据库定义,并可能会被应用更改。

    Azure Data Studio 中“架构比较源选择”对话框的屏幕截图。

    选择完成后,选择“确定”关闭对话框并返回到“架构比较”窗口。

  3. 还可以在“架构比较”窗口工具栏中选择“选项”按钮,以指定比较的对象、忽略的差异类型以及其他设置。

  4. 在“架构比较”窗口工具栏上,选择“比较”按钮以开始比较过程。

    在比较完成后,项目和数据库之间的结构差异将显示在该窗口上半部分中的“结果”窗格中。 默认情况下,比较结果将按操作(例如,删除、更改或添加)对所有差异进行分组。 在“结果”窗格中,在数据库定义上有差异的每个数据库对象显示一行。 每一行都标识了源架构和/或目标架构中的对象,以及为使目标对象与源对象相同而将对目标架构执行的操作。 如果已重构某个对象并对其重命名或将其移至新架构,则源名称和目标名称会不同,并且源名称将显示为粗体以突出显示差异。

    Azure Data Studio 中架构比较界面的屏幕截图,其中比较了数据库与项目。

  5. 默认情况下,所有差异都包含在“更新目标”操作的范围内。 可以排除你不希望同步的差异。 为此,请取消选中每行中心的“操作”列。 或者,可以在“架构”窗格中右键单击某一行,然后选择“排除”。 该行将立即灰显。在使用架构比较更新目标数据库时,将不认为该行存在任何挂起的更改。

    也可以右键单击某个组行并选择“全部排除”或“全部包含”,此操作等效于取消选中或选中该组中的所有差异。 在按架构对结果进行分组时,这是包含或排除对特定架构做出的所有更改的有用方式。

    如果所排除的行有任何依赖对象(例如,由“视图”行引用的“表”行),则将禁用排除的行,但不会清除其复选框。 取消选中依赖于它的所有行后,禁用的行将处于取消选中状态。 此外,如果重构了某行(重命名或移动到其他架构),则会禁用该行及其任何依赖子行的复选框。

    如果刷新比较,则已选择跳过的那些差异将被忽略。

要更新目标数据库架构,有两个选项。 如果目标为数据库或项目,则可以直接从包含“应用”按钮的“架构比较”窗口更新目标;如果目标为包含“生成脚本”按钮的数据库,则可以生成更新脚本。 生成的脚本将显示在 Transact-SQL 编辑器中,可以从该编辑器中检查该脚本并针对数据库执行该脚本。

架构比较需要图形工具,例如 Visual Studio 或 Azure Data Studio。