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

 

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

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

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

以下过程将比较数据库项目的架构与连接的数据库。

警告

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

警告

以下过程将使用在连接的数据库开发面向项目的脱机数据库开发这两节中的之前的过程中创建的实体。

比较数据库定义

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

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

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

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

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

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

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

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

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

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

  6. 在**“架构比较”窗口工具栏上单击“比较”**按钮以开始比较过程。

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

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

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

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

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

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

    警告

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

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

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

警告

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

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

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

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

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

通过脚本更新

  1. 在“架构比较”窗口工具栏上单击**“生成脚本”**按钮(从左边数第四个按钮)。

    生成的脚本将显示在新的 Transact-SQL 编辑器窗口中。

    警告

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

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

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

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

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

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

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