如何指定合并项目冲突解决程序(复制 Transact-SQL 编程)

当为合并发布定义项目时,可以指定自定义冲突解决程序。 有关详细信息,请参阅高级合并复制冲突的检测和解决。 Microsoft SQL Server 包括许多预定义的自定义冲突解决程序,您也可以编写您自己的自定义冲突解决程序。 如果需要实现针对复制的每一行而非只是针对冲突行执行的自定义逻辑,请参阅如何实现合并项目的业务逻辑处理程序(复制编程)

注册自定义冲突解决程序

  1. 如果打算注册您自己的自定义冲突解决程序,请创建以下类型之一:

  2. 若要确定所需冲突解决程序是否已注册,请在发布服务器上对任一数据库执行 sp_enumcustomresolvers (Transact-SQL)。 这将显示自定义冲突解决程序的说明以及在分发服务器上注册的每个基于 COM 的冲突解决程序的类标识符 (CLSID),或者显示在分发服务器上注册的每个业务逻辑处理程序的托管程序集相关信息。

  3. 如果尚未注册所需的自定义解决程序,请在发布服务器上执行 sp_registercustomresolver (Transact-SQL)。 为 @article_resolver 指定冲突解决程序的名称;对于业务逻辑处理程序,此为程序集的友好名称。 对于基于 COM 的冲突解决程序,为 @resolver_clsid 指定 DLL 的 CLSID;对于业务逻辑处理程序,为 @is_dotnet_assembly 指定值 true,为 @dotnet_assembly_name 指定程序集名称,并为 @dotnet_class_name 指定覆盖 BusinessLogicModule 的类的完全限定名称。

    注意注意

    如果业务逻辑处理程序程序集与合并代理可执行文件不是部署在同一目录中,与同步启动合并代理的应用程序不是部署在同一目录中,或者不是部署在全局程序集缓存 (GAC) 中,则需要为 @dotnet_assembly_name 指定带有程序集名称的完整路径。

  4. 如果冲突解决程序是基于 COM 的冲突解决程序,则:

    • 将自定义冲突解决程序 DLL 复制到分发服务器(对于推送订阅)或订阅服务器(对于请求订阅)。

      注意注意

      Microsoft 自定义冲突解决程序位于 C:\Program Files\Microsoft SQL Server\100\COM 目录中。

    • 使用 regsvr32.exe 向操作系统注册自定义冲突解决程序 DLL。 例如,从命令提示符处执行以下命令可注册 SQL Server 累加性冲突解决程序:

      regsvr32 ssradd.dll
      
  5. 如果冲突解决程序为业务逻辑处理程序,则将程序集与合并代理可执行文件 (replmerg.exe) 部署在同一文件夹中,与调用合并代理的应用程序部署在同一文件夹中,或者部署在步骤 3 中为 @dotnet_assembly_name 参数指定的文件夹中。

    注意注意

    合并代理可执行文件的默认安装位置为 C:\Program Files\Microsoft SQL Server\100\COM。

定义合并项目时指定自定义冲突解决程序

  1. 如果您打算使用自定义冲突解决程序,请通过上述过程创建和注册冲突解决程序。

  2. 在发布服务器上执行 sp_enumcustomresolvers (Transact-SQL) 并记下所需自定义冲突解决程序在结果集的 value 字段中的名称。

  3. 在发布服务器上,对发布数据库执行 sp_addmergearticle (Transact-SQL)。 为 @article_resolver 指定从步骤 2 获得的冲突解决程序的名称,并使用 @resolver_info 参数指定自定义冲突解决程序所需的任何输入内容。 对于基于存储过程的自定义冲突解决程序,@resolver_info 为存储过程的名称。 有关 Microsoft 提供的冲突解决程序所需输入内容的详细信息,请参阅 Microsoft 基于 COM 的冲突解决程序

为现有合并项目指定或更改自定义冲突解决程序

  1. 若要确定是否已为项目定义自定义冲突解决程序,或要获取冲突解决程序的名称,请执行 sp_helpmergearticle (Transact-SQL)。 如果已为项目定义自定义冲突解决程序,则其名称将显示在 article_resolver 字段中。 为冲突解决程序提供的任何输入内容都将显示在结果集的 resolver_info 字段中。

  2. 在发布服务器上执行 sp_enumcustomresolvers (Transact-SQL) 并记下所需自定义冲突解决程序在结果集的 value 字段中的名称。

  3. 在发布服务器上,对发布数据库执行 sp_changemergearticle (Transact-SQL)。 将 @property 的值指定为 article_resolver(包括业务逻辑处理程序的完整路径),并为 @value 指定从步骤 2 获得的所需自定义冲突解决程序的名称。

  4. 若要更改自定义冲突解决程序所需的任何输入内容,请再次执行 sp_changemergearticle (Transact-SQL)。 将 @property 的值指定为 resolver_info并为 @value 指定自定义冲突解决程序所需的任何输入内容。 对于基于存储过程的自定义冲突解决程序,@resolver_info 为存储过程的名称。 有关所需输入内容的详细信息,请参阅 Microsoft 基于 COM 的冲突解决程序

撤消注册自定义冲突解决程序

  1. 在发布服务器上执行 sp_enumcustomresolvers (Transact-SQL) 并记下要删除的自定义冲突解决程序在结果集的 value 字段中的名称。

  2. 在分发服务器上执行 sp_unregistercustomresolver (Transact-SQL)。 为 @article_resolver 指定从步骤 1 获得的自定义冲突解决程序的完整名称。

示例

本示例创建了一个新项目,并指定当发生冲突时,将使用 SQL Server 平均化冲突解决程序计算 UnitPrice 列的平均值。

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';

EXEC sp_addmergearticle 
    @publication = @publication, 
    @article = @article, 
    @source_object = @article, 
    @article_resolver = 'Microsoft SQL Server Averaging Conflict Resolver', 
    @resolver_info = 'UnitPrice';
GO

本示例更改了一个项目以指定当发生冲突时,将使用 SQL Server 累加性冲突解决程序计算 UnitsOnOrder 列的总和。

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';

EXEC sp_changemergearticle 
    @publication = @publication, 
    @article = @article, 
    @property='article_resolver', 
    @value='Microsoft SQL Server Additive Conflict Resolver';

EXEC sp_changemergearticle 
    @publication = @publication, 
    @article = @article, 
    @property='resolver_info', 
    @value='UnitsOnOrder';
GO