合并复制的冲突解决

适用于:SQL Server

可以根据为每个项目指定的冲突解决程序来解决合并发布中的冲突。 默认情况下,解决冲突无需用户干预。 但是,可以在 Microsoft 复制冲突查看器中查看冲突,并更改解决的结果。

在冲突保持期的指定时间(默认值为 14 天)内,可以在复制冲突查看器中查看冲突数据。 若要设置冲突保持期,请执行以下任一操作:

默认情况下,冲突信息存储在下列位置:

  • 如果发布兼容级别为 90RTM 或更高,则存储在发布服务器和订阅服务器上。
  • 如果发布兼容级别低于 80RTM,则存储在发布服务器上。
  • 如果订阅服务器运行的是 SQL Server Compact,则存储在发布服务器上。 冲突数据不能存储在 SQL Server Compact 订阅服务器上。

冲突信息的存储受 conflict_logging 发布属性的控制。 有关详细信息,请参阅 sp_addmergepublication (Transact-SQL)sp_changemergepublication (Transact-SQL)

也可以在同步过程中使用 Microsoft 交互式冲突解决程序以交互方式解决冲突。 交互式冲突解决程序可以通过 Microsoft Windows 同步管理器获取。 有关详细信息,请参阅使用 Windows 同步管理器同步订阅(Windows 同步管理器)

解决冲突

  1. 在 Microsoft SQL Server Management Studio 中连接到发布服务器(或者订阅服务器),然后展开服务器节点。

  2. 展开 “复制” 文件夹,再展开 “本地发布” 文件夹。

  3. 右键单击要查看其冲突的发布,然后单击 “查看冲突”

    注意

    如果为 conflict_logging 属性指定了值 “subscriber”“查看冲突” 菜单选项将不可用。 若要查看冲突,请在命令提示符下启动 ConflictViewer.exe。 默认情况下,ConflictViewer.exe 位于以下目录中:Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE。 要获取有效引导参数的列表,请运行 ConflictViewer.exe -?。

  4. “选择冲突表” 对话框中,选择要查看冲突的数据库、发布和表。

  5. 在复制冲突查看器中可以:

    • 使用上部网格右侧的按钮来筛选行。

    • 在上部网格中选择行,以在下部网格中显示该行的信息。

    • 在上部网格中选择一行或多行,然后单击 “删除”,这与单击 “提交入选方” 按钮的效果相同(不对数据进行任何更改)。

    • 单击属性按钮 (...) 查看有关冲突所涉及的列的详细信息

    • 编辑 “冲突解决入选方”“冲突解决落选方” 列中的数据,然后再提交数据(如果列为灰色,则数据为只读)。

    • 单击 “提交入选方” 接受指定为冲突入选方的行。

    • 单击 “提交落选方” 覆盖解决结果,并将指定为冲突落选方的值传播到拓扑中的所有节点。

    • 选择 “记录此冲突的详细信息” 将冲突数据记录到一个文件中。 若要指定文件的位置,请指向 “查看” 菜单,然后单击 “选项”。 输入一个值,或单击浏览按钮 (...),然后导航到相应文件。 单击 “确定” 可退出 “选项” 对话框。

  6. 关闭复制冲突查看器。

查看冲突信息

在合并复制中解决冲突后,落选行中的数据将写入冲突表中。 这些冲突数据可以使用复制存储过程以编程方式进行查看。 有关详细信息,请参阅 高级合并复制冲突的检测和解决

  1. 在发布服务器上,对发布数据库执行 sp_helpmergepublication。 请注意结果集中以下列的值:

    • centralized_conflicts - 1 指示冲突行存储在发布服务器上,0 指示冲突行未存储在发布服务器上。

    • decentralized_conflicts - 1 指示冲突行存储在订阅服务器上,0 指示冲突行未存储在订阅服务器上。

      注意

      合并发布的冲突日志记录行为是通过使用 sp_addmergepublication@conflict_logging 参数设置的。 已不推荐使用 @centralized_conflicts 参数。

    下表基于为 @conflict_logging 指定的值描述了这些列的值。

    @conflict_logging 值 centralized_conflicts decentralized_conflicts
    publisher 1 0
    subscriber 0 1
    两者 1 1
  2. 在发布服务器上对发布数据库,或在订阅服务器上对订阅数据库执行 sp_helpmergearticleconflicts。 为 @publication 指定值,以便只返回属于特定发布的项目的冲突信息。 这将返回具有冲突的项目的冲突表信息。 请注意任何相关项目的 conflict_table 值。 如果项目的 conflict_table 值为 NULL,则在该项目中只发生了删除冲突。

  3. (可选)查看相关项目的冲突行。 根据步骤 1 中 centralized_conflictsdecentralized_conflicts 的值,请执行下列操作之一:

    • 在发布服务器上,对发布数据库执行 sp_helpmergeconflictrows。 请为步骤 1 中的项目的 @conflict_table 指定冲突表。 (可选)指定 @publication 的值,以便将返回的冲突信息限制为特定发布。 这将会返回落选行的行数据和其他信息。

    • 在订阅服务器上,对订阅数据库执行 sp_helpmergeconflictrows。 请为步骤 1 中的项目的 @conflict_table 指定冲突表。 这将会返回落选行的行数据和其他信息。

无法删除的冲突

  1. 在发布服务器上,对发布数据库执行 sp_helpmergepublication。 请注意结果集中以下列的值:

    • centralized_conflicts - 1 指示冲突行存储在发布服务器上,0 指示冲突行未存储在发布服务器上。

    • decentralized_conflicts - 1 指示冲突行存储在订阅服务器上,0 指示冲突行未存储在订阅服务器上。

      注意

      合并发布的冲突日志记录行为是通过使用 sp_addmergepublication@conflict_logging 参数设置的。 已不推荐使用 @centralized_conflicts 参数。

  2. 在发布服务器上对发布数据库,或在订阅服务器上对订阅数据库执行 sp_helpmergearticleconflicts。 为 @publication 指定值,以便只返回属于特定发布的项目的冲突表信息。 这将返回具有冲突的项目的冲突表信息。 请注意任何相关项目的 source_object 值。 如果项目的 conflict_table 值为 NULL,则在该项目中只发生了删除冲突。

  3. (可选)查看删除冲突的冲突信息。 根据步骤 1 中 centralized_conflictsdecentralized_conflicts 的值,请执行下列操作之一:

    • 在发布服务器上,对发布数据库执行 sp_helpmergedeleteconflictrows。 为 @source_object 指定步骤 1 中发生冲突的源表的名称。 (可选)指定 @publication 的值,以便将返回的冲突信息限制为特定发布。 这将返回发布服务器上存储的删除冲突信息。

    • 在订阅服务器上,对订阅数据库执行 sp_helpmergedeleteconflictrows。 为 @source_object 指定步骤 1 中发生冲突的源表的名称。 (可选)指定 @publication 的值,以便将返回的冲突信息限制为特定发布。 这将返回订阅服务器上存储的删除冲突信息。

另请参阅

Advanced Merge Replication Conflict Detection and Resolution
指定合并项目冲突解决程序