如何为合并项目实现基于存储过程的自定义冲突解决程序(复制 Transact-SQL 编程)

您可以编写您自己的自定义冲突解决程序以作为每个发布服务器上的 Transact-SQL 存储过程。在同步过程中,如果在注册了冲突解决程序的项目中遇到冲突,则将调用此存储过程,并且合并代理会将有关冲突行的信息传递到该存储过程的所需参数中。基于存储过程的自定义冲突解决程序将始终在发布服务器上创建。

注意注意

调用 MicrosoftSQL Server 存储过程冲突解决程序只是为了处理基于行更改的冲突。它们不能用于处理其他类型的冲突,例如由于 PRIMARY KEY 冲突或唯一索引约束冲突而造成的插入失败。

创建基于存储过程的自定义冲突解决程序

  1. 在发布服务器的发布数据库或 msdb 数据库中,创建用于实现以下所需参数的新系统存储过程:

    参数

    数据类型

    说明

    @tableowner

    sysname

    冲突被解决的表的所有者名称。这是发布数据库中的表的所有者。

    @tablename

    sysname

    冲突被解决的表的名称。

    @rowguid

    uniqueidentifier

    具有冲突的行的唯一标识符。

    @subscriber

    sysname

    传播冲突更改的源服务器的名称。

    @subscriber_db

    sysname

    传播冲突更改的源数据库的名称。

    @log_conflict OUTPUT

    int

    合并进程是否应记录冲突以便以后进行解决:

    0 = 不记录冲突。

    1 = 订阅服务器是冲突解决落选方。

    2 = 发布服务器是冲突解决落选方。

    @conflict_message OUTPUT

    nvarchar(512)

    记录冲突时要提供的有关解决方法的消息。

    @destowner

    sysname

    订阅服务器上的已发布表的所有者。

    此存储过程使用合并代理传递给这些参数的值来实现自定义冲突解决逻辑;它必须返回结构与基表结构相同的单行结果集,并且包含该行的入选版本的数据值。

  2. 向订阅服务器用来连接到发布服务器的任何登录名授予对存储过程的 EXECUTE 权限。

将自定义冲突解决程序用于新的表项目

将自定义冲突解决程序用于现有表项目

  1. 执行 sp_changemergearticle,指定 @publication@article,将 @property 的值指定为 article_resolver,将 @value 的值指定为 MicrosoftSQL Server Stored ProcedureResolver

  2. 执行 sp_changemergearticle,指定 @publication@article 并指定 @property 的值为 resolver_info,同时为 @value 指定用于实现冲突解决程序逻辑的存储过程的名称。