为合并项目实现自定义冲突解决程序

本主题介绍如何使用 Transact-SQL 或基于 COM 的自定义冲突解决程序为 SQL Server 2014 中的合并项目实现自定义冲突解决程序

本主题内容

“使用 Transact-SQL”

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

注意

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

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

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

    参数 数据类型 说明
    @tableowner sysname 冲突被解决的表的所有者名称。 这是发布数据库中的表的所有者。
    @tablename sysname 冲突被解决的表的名称。
    @rowguid uniqueidentifier 具有冲突的行的唯一标识符。
    @subscriber sysname 传播冲突更改的源服务器的名称。
    @subscriber_db sysname 传播冲突更改的源数据库的名称。
    @log_conflict输出 int 合并进程是否应记录冲突以便以后进行解决:

    0 = 不记录冲突。

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

    2 = 发布服务器是冲突解决落选方。
    @conflict_message输出 nvarchar(512) 记录冲突时要提供的有关解决方法的消息。
    @destowner sysname 订阅服务器上的已发布表的所有者。

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

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

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

  1. 执行 sp_addmergearticle 以定义一个项目,为 @article_resolver参数指定值 MicrosoftSQL Server Stored Procedure Resolver ,并为 @resolver_info 参数指定用于实现冲突解决程序逻辑的存储过程的名称。 有关详细信息,请参阅 定义项目

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

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

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

使用基于 COM 的自定义冲突解决程序

Microsoft.SqlServer.Replication.BusinessLogicSupport 命名空间实现了一个接口,可以利用该接口编写复杂的业务逻辑以处理事件并解决在合并复制同步过程中发生的冲突。 有关详细信息,请参阅 为合并项目实现业务逻辑处理程序。 您也可以编写自己的基于本机代码的自定义业务逻辑以解决冲突。 此逻辑构建为 COM 组件,并使用 Microsoft Visual C++ 等产品编译为动态链接库 (DLL) 。 这类基于 COM 的自定义冲突解决程序必须实现 ICustomResolver 接口,该接口是专为解决冲突而设计的

创建和注册基于 COM 的自定义冲突解决程序

  1. 在与 COM 兼容的创作环境中,添加对自定义冲突解决程序库的引用。

  2. 对于 Visual C++ 项目,请使用 #import 命令将该库导入项目中。

  3. 创建一个用于实现 ICustomResolver 接口的类。

  4. 实现某些特定的方法和属性。

  5. 生成项目以创建自定义冲突解决程序库文件。

  6. 将该库部署在包含合并代理可执行文件的目录(通常为 \Microsoft SQL Server\100\COM)中。

    注意

    对于请求订阅,必须在订阅服务器上部署自定义冲突解决程序;对于推送订阅,必须在分发服务器上部署;或者部署在使用 Web 同步的 Web 服务器上。

  7. 使用 regsvr32.exe 注册部署目录中的自定义冲突解决程序库,如下所示:

    regsvr32.exe mycustomresolver.dll  
    
  8. 在发布服务器上,执行 sp_enumcustomresolvers (Transact-SQL) ,以验证该库是否尚未注册为自定义冲突解决程序。

  9. 若要将库注册为自定义冲突解决程序,请在分发服务器上执行 sp_registercustomresolver (Transact-SQL) 。 为 @article_resolver 指定 COM 对象的友好名称,为 @resolver_clsid 指定库的 ID (CLSID ) ,为@is_dotnet_assembly 指定值false

    注意

    不再需要时,可以使用 sp_unregistercustomresolver (Transact-SQL) 取消注册自定义冲突解决程序。

  10. (可选)在集群上,对集群的所有节点重复步骤 5-8 来注册自定义冲突解决程序。 为了确保在故障转移之后自定义冲突解决程序能够正确载入协调器,此操作是必需的。

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

  1. 在发布服务器上,执行 sp_enumcustomresolvers (Transact-SQL) ,并记下所需冲突解决程序的友好名称。

  2. 在发布服务器上,对发布数据库执行 sp_addmergearticle (Transact-SQL) 以定义项目。 为 @article_resolver指定步骤 1 中项目冲突解决程序的友好名称。 有关详细信息,请参阅 定义项目

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

  1. 在发布服务器上,执行 sp_enumcustomresolvers (Transact-SQL) ,并记下所需冲突解决程序的友好名称。

  2. 执行 sp_changemergearticle (Transact-SQL) ,为 @property 指定@publication@article、值 article_resolver,并为 @value 指定步骤 1 中的项目冲突解决程序的友好名称。

查看示例自定义冲突解决程序

  1. SQL Server 2000 示例文件中提供了示例。 下载 sql2000samples.zip。 这会下载 3 个文件,相当于 6.9 MB。

  2. 从下载的压缩 .cab 文件中提取文件。

  3. 运行 setup.exe

    注意

    选择安装选项时,仅需安装 复制 示例。 (默认安装路径为 C:\Program Files (x86) \Microsoft SQL Server 2000 Samples\1033\)

  4. 转至安装文件夹。 (默认文件夹为 C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe

  5. 运行 unzip_sqlreplSP3.exe 程序。

    注意

    默认情况下,com 冲突解决程序示例将安装到 C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres 文件夹。

  6. subspres 文件夹中,在所有源文件中查找所有出现的 #include sqlres.h ,将其替换为 #import "replrec.dll" no_namespace, raw_interfaces_only

另请参阅

Advanced Merge Replication Conflict Detection and Resolution
基于 COM 的自定义冲突解决程序
复制安全最佳做法