架构比较概述
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例
使用架构比较工具可以比较两个数据库定义,其中比较的源和目标可以是连接的数据库、SQL 数据库项目或 .dacpac
文件的任意组合。 比较完成后,比较的结果将显示为一组操作,使目标与源以与源控件差异类似的方式相同。 从架构比较界面中,可以直接更新目标(如果目标为项目或数据库)或生成具有相同效果的更新脚本。
架构比较提供以下功能:
- 比较两个 dacpac 文件、数据库或 SQL 项目之间的架构。
- 将结果视为针对目标执行的一组操作,使其与源匹配。
- 选择性地排除结果中列出的操作。
- 设置控制比较范围的选项。
- 将更改直接应用于目标,或生成脚本以稍后应用更改。
- 保存比较结果。
功能
源和目标之间的差异会在网格中显示以便进行查看。 可以在派生自以下任何一项的数据库模型之间的任一方向进行比较:
- 连接数据库
- SQL 数据库项目
.dacpac
文件
在架构比较中,可以深入了解并查看结果网格或脚本窗体中的每个差异,其中在每个行级别提供了更改的详细信息。 在更新目标之前,还可以有选择地排除特定差异。 Visual Studio、Azure Data Studio 和命令行中提供了架构比较工具。
架构比较选项
架构比较选项是从 DacFx .NET 库提供的部署选项中提取的。 这些选项包括:
- 忽略空格
- 忽略分区方案
- 忽略列顺序
- 删除不在源中的索引
- 阻止可能的数据丢失
还可以配置比较中包含的对象类型。 这些对象包括表、存储过程、索引、权限、用户定义的类型等等。
架构比较文件
架构比较的比较定义可以另存为 .scmp
文件,称为架构比较文件。 此文件在 XML 中存储有关架构比较的信息,并包括:
- 源和目标连接信息
- 比较选项
- 排除的对象类型
可以在 Visual Studio 或 Azure Data Studio 中打开 .scmp
文件,以便以后再次轻松运行同一比较,或与他人共享比较。
启动和使用架构比较
在 Visual Studio 中的“工具”菜单上,选择“SQL Server”,然后选择“新建架构比较”。
或者,在解决方案资源管理器中右键单击“TradeDev”项目,然后选择“架构比较”。
“架构比较”窗口随即打开,并且 Visual Studio 会自动为该窗口分配一个名称,如
SqlSchemaCompare1
。紧邻“架构比较”窗口工具栏的下方将显示两个下拉列表菜单,两个菜单之间有一个绿色箭头。 可以使用这两个菜单为比较源和目标选择数据库定义。
在“选择源”下拉列表中,选择“选择源”,“选择源架构”对话框随即打开。
如果通过右键单击项目名称打开“架构比较”窗口,则源架构已经填充,可以前进到步骤 4。
通过选择“项目”、“数据库”连接或 .dacpac 文件完成架构比较源的选择。 源是要用作目标更改的基础的数据库定义。
从“架构比较”窗口的“选择目标”下拉列表中,选择“选择目标”,“选择目标架构”对话框随即打开。 通过选择“项目”、“数据库”连接或 .dacpac 文件完成架构比较目标的选择。 目标是要评估的数据库定义,并可能会被应用更改。
还可以在“架构比较”窗口工具栏中选择“选项”按钮,以指定比较的对象、忽略的差异类型以及其他设置。
在“架构比较”窗口工具栏上,选择“比较”按钮以开始比较过程。
在比较完成后,项目和数据库之间的结构差异将显示在该窗口上半部分中的“结果”窗格中。 默认情况下,比较结果将按操作(例如,删除、更改或添加)对所有差异进行分组。 在“结果”窗格中,在数据库定义上有差异的每个数据库对象显示一行。 每一行都标识了源架构和/或目标架构中的对象,以及为使目标对象与源对象相同而将对目标架构执行的操作。 如果已重构某个对象并对其重命名或将其移至新架构,则源名称和目标名称会不同,并且源名称将显示为粗体以突出显示差异。
默认情况下,结果列表会隐藏在两个架构中相同的对象或无法更新的对象(例如,内置对象)。 你可以在工具栏上选择适当的筛选按钮来显示这些对象。
若要更改分组首选项,请在工具栏上选择“对结果分组”下拉列表。 选择“类型”以按对象类型(例如,按表、视图或存储过程)对结果进行分组。
默认情况下,所有差异都包含在“更新目标”操作的范围内。 可以排除你不希望同步的差异。 为此,请取消选中每行中心的“操作”列。 或者,可以在“架构”窗格中右键单击某一行,然后选择“排除”。 该行将立即灰显。在使用架构比较更新目标数据库时,将不认为该行存在任何挂起的更改。
也可以右键单击某个组行并选择“全部排除”或“全部包含”,此操作等效于取消选中或选中该组中的所有差异。 在按架构对结果进行分组时,这是包含或排除对特定架构做出的所有更改的有用方式。
如果所排除的行有任何依赖对象(例如,由“视图”行引用的“表”行),则将禁用排除的行,但不会清除其复选框。 取消选中依赖于它的所有行后,禁用的行将处于取消选中状态。 此外,如果重构了某行(重命名或移动到其他架构),则会禁用该行及其任何依赖子行的复选框。
如果刷新比较,则已选择跳过的那些差异将被忽略。
要更新目标数据库架构,有两个选项。 如果目标为数据库或项目,则可以直接从“架构比较”窗口更新目标;如果目标为数据库或数据库文件,则可以生成更新脚本。 生成的脚本将显示在 Transact-SQL 编辑器中,可以从该编辑器中检查该脚本并针对数据库执行该脚本。
Visual Studio 中的 SDK 式 SQL 项目预览版中尚不提供图形架构比较功能。 使用 Azure Data Studio 比较架构。
注意
Visual Studio Code 中不提供架构比较。 使用 Azure Data Studio 或 Visual Studio 比较架构。
在命令面板 (
ctrl/cmd+shift+P
) 中的 Azure Data Studio 中,搜索并选择“架构比较”。或者,右键单击“数据库项目”视图中的数据库项目或“对象资源管理器”中的数据库,然后选择“架构比较”。
此时会打开“架构比较”窗口,并且源或目标可能会基于启动点预设。
紧邻“架构比较”窗口工具栏的下方将显示两个省略号按钮,两个按钮之间有一个绿色箭头。 可以使用这两个菜单为比较源和目标选择数据库定义。
为源或目标选择省略号按钮会打开一个对话框,两者都可以在其中更新。 通过选择“项目”、“数据库”连接或 .dacpac 文件完成架构比较源的选择。 源是要用作目标更改的基础的数据库定义。 目标是要评估的数据库定义,并可能会被应用更改。
选择完成后,选择“确定”关闭对话框并返回到“架构比较”窗口。
还可以在“架构比较”窗口工具栏中选择“选项”按钮,以指定比较的对象、忽略的差异类型以及其他设置。
在“架构比较”窗口工具栏上,选择“比较”按钮以开始比较过程。
在比较完成后,项目和数据库之间的结构差异将显示在该窗口上半部分中的“结果”窗格中。 默认情况下,比较结果将按操作(例如,删除、更改或添加)对所有差异进行分组。 在“结果”窗格中,在数据库定义上有差异的每个数据库对象显示一行。 每一行都标识了源架构和/或目标架构中的对象,以及为使目标对象与源对象相同而将对目标架构执行的操作。 如果已重构某个对象并对其重命名或将其移至新架构,则源名称和目标名称会不同,并且源名称将显示为粗体以突出显示差异。
默认情况下,所有差异都包含在“更新目标”操作的范围内。 可以排除你不希望同步的差异。 为此,请取消选中每行中心的“操作”列。 或者,可以在“架构”窗格中右键单击某一行,然后选择“排除”。 该行将立即灰显。在使用架构比较更新目标数据库时,将不认为该行存在任何挂起的更改。
也可以右键单击某个组行并选择“全部排除”或“全部包含”,此操作等效于取消选中或选中该组中的所有差异。 在按架构对结果进行分组时,这是包含或排除对特定架构做出的所有更改的有用方式。
如果所排除的行有任何依赖对象(例如,由“视图”行引用的“表”行),则将禁用排除的行,但不会清除其复选框。 取消选中依赖于它的所有行后,禁用的行将处于取消选中状态。 此外,如果重构了某行(重命名或移动到其他架构),则会禁用该行及其任何依赖子行的复选框。
如果刷新比较,则已选择跳过的那些差异将被忽略。
要更新目标数据库架构,有两个选项。 如果目标为数据库或项目,则可以直接从包含“应用”按钮的“架构比较”窗口更新目标;如果目标为包含“生成脚本”按钮的数据库,则可以生成更新脚本。 生成的脚本将显示在 Transact-SQL 编辑器中,可以从该编辑器中检查该脚本并针对数据库执行该脚本。
架构比较需要图形工具,例如 Visual Studio 或 Azure Data Studio。