如何:使用架构比较来比较不同数据库定义

SQL Server Data Tools (SSDT) 包含一个可用来比较两个数据库定义的架构比较实用工具。 比较的源和目标可以是连接的数据库、SQL Server 数据库项目、快照或 .dacpac 文件的任意组合。 比较的结果会显示为一组操作,必须针对目标执行这些操作才能使其与源一致。 比较完成后,可以直接更新目标(如果目标为项目或数据库)或生成具有相同效果的更新脚本。

源和目标之间的差异会在网格中显示以便进行查看。 您可以深入探讨并查看结果网格中的或脚本形式的每项差异。 之后,可以选择性地排除特定差异。

可以将比较另存为 SQL Server 数据库项目的一部分或一个单独的文件。 您还可以设置用于控制比较范围和更新方面的选项。 然后,可以保存比较以便稍后能轻松重复相同的比较或将其用作新比较的起点。

警告

如果某一项目被指定为比较目标,则该项目的支持的最大路径长度(不包括驱动器号、冒号和前导反斜杠)是 256 个字符。 如果您的项目路径超过 256 个字符,则仍将能够将其架构与某一数据库或其他项目进行比较。 但是,您将不能更新其架构。

以下过程将比较数据库项目的架构与连接的数据库。 它使用在管理表、关系和修复错误以及面向项目的脱机数据库开发部分中的先前过程中创建的实体。

比较数据库定义

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

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

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

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

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

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

  3. 选择“项目”单选按钮,然后选择在上一个过程中创建的“TradeDev”数据库项目。

  4. 从“架构比较”窗口的“选择目标”下拉菜单中,选择“选择目标”,“选择目标架构”对话框随即打开。 在“架构”部分,单击“数据库”单选按钮,然后单击“新建连接”按钮。

  5. 在“连接属性”对话框中,输入 TradeDev 数据库所在的服务器名称并且确保提供正确的身份验证凭据。 然后,在“连接到数据库”中选择“TradeDev”,然后选择“确定”。

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

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

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

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

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

  7. Products 组中查找 Tables 表。 选择该行,表的源定义和目标定义将显示在“对象定义”窗格中,并将突出显示二者的差异。 也可以在“结果”窗格中展开 Products 表行以检查表中有差异的特定元素。

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

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

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

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

    • 如果使用 SQLCMD 变量,则“架构比较”工具在项目属性中使用本地值,默认值将被忽略。 有关详细信息,请参阅数据库项目设置

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

警告

由于我们的更改涉及到将列从 NOT NULL 更改为 NULL,从而会导致数据丢失,因此更新将失败。 如果希望继续更新,请选择“架构比较”工具栏上的“选项”按钮(左起第五个按钮)并取消选中“如果发生数据丢失,则阻止增量部署”选项。

将架构与 Visual Studio 自动化模型进行比较

  1. 打开“视图”菜单,指向“其他窗口”,然后选择“命令窗口”。

  2. 在命令窗口中,键入以下命令:

    Tools.SSDTNewSchemaComparison
    

在“架构比较”窗口中直接更新

  1. 在“架构比较”窗口工具栏上选择“更新”按钮。

  2. 检查生成的更改脚本。 您可以通过使用“文件”/“新建”菜单保存该脚本。 这会在你无权更新生产数据库时带来便利,因为在这种情况下,你可以将该脚本提供给 DBA 以便以后部署。

  3. 如果具有更新数据库所需的权限,请选择编辑窗格工具栏上的“执行查询”按钮以运行该脚本。

通过脚本更新

  1. 在“架构比较”窗口工具栏上选择“生成脚本”按钮(左起第四个按钮)。

    生成的脚本将会在一个新的 Transact-SQL 编辑器窗口中打开

    警告

    仅 SSDT 快照进程生成的 .dacpac 文件支持此行为。 此时,不能以 SQL 数据层应用程序 (DAC) 工具或框架生成的 .dacpac 文件为目标。

  2. 检查生成的更改脚本。 可以使用“文件/保存”或“文件/另存为”菜单命令保存该脚本。

    当你未获得更新生产数据库的授权时,保存的脚本会提供便利。 在这样的情况下,你可以将该脚本提供给 DBA 以供稍后部署。

    或者,可以将 Transact-SQL 编辑器连接到适当的服务器并直接执行该脚本。 必须具有创建或更新数据库所需的权限,才能执行此过程。 如果具有更新数据库所需的权限,请选择编辑窗格工具栏上的“执行查询”按钮以运行该脚本。

  3. 选择“连接”按钮。 此操作将连接到当前服务器,或提示你在“连接到服务器”对话框中输入或选择一个服务器。 数据库名称在该脚本中定义为命令变量。

  4. 检查该脚本,如有必要,可以对定义目标数据库名称和关联的前缀与文件路径的命令变量做出任何更改。

  5. 在编辑窗格工具栏中选择“执行”按钮以运行该脚本。

另请参阅