如何为合并项目实现基于 COM 的自定义冲突解决程序(复制编程)

Microsoft.SqlServer.Replication.BusinessLogicSupport 命名空间实现了一个接口,利用该接口,您可编写复杂的业务逻辑来处理事件并解决在合并复制同步过程中发生的冲突。有关详细信息,请参阅如何实现合并项目的业务逻辑处理程序(复制编程)。您也可以编写自己的基于本机代码的自定义业务逻辑以解决冲突。使用诸如 Microsoft Visual C++ 之类的产品,此逻辑可作为 COM 组件生成并编译到动态链接库 (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)。将 COM 对象的友好名称指定给 @article_resolver,将库的 ID (CLSID) 指定给 @resolver_clsid,将 false 值指定给 @is_dotnet_assembly

    注意注意

    当不再需要自定义冲突解决程序时,可使用 sp_unregistercustomresolver (Transact-SQL) 撤销对其的注册。

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

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

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

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

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

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

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