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

适用于SQL Server

本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中指定合并项目解析程序。

建议

  • 合并复制允许使用下列类型的项目冲突解决程序:

  • 若要使用默认冲突解决程序以外的其他冲突解决程序,必须将该冲突解决程序复制到运行合并代理的计算机并对其进行注册(如果使用的是业务逻辑处理程序,还必须在发布服务器上注册)。 合并代理可以运行于:

    • 分发服务器,对于推送订阅

    • 订阅服务器,对于请求订阅

    • Microsoft Internet Information Services (IIS) 服务器,用于使用 Web 同步的请求订阅

使用 SQL Server Management Studio

注册解析程序之后,在“项目属性 - <项目>”对话框(可在新建发布向导和“发布属性 - <发布>”对话框中获取)的“解析程序”选项卡上指定项目是否应使用该解析程序。 有关如何使用该向导和如何访问该对话框的详细信息,请参阅创建发布查看和修改发布属性

指定冲突解决程序

  1. 在新建发布向导的“项目”页或“发布属性 - <发布>”对话框中,选择一个表。

  2. 单击 “项目属性”,再单击 “设置突出显示的表项目的属性”

  3. 在“项目属性 - <项目>”页上,单击“解析程序”选项卡。

  4. 选择 “使用自定义冲突解决程序(已在分发服务器上注册)”,然后在列表中单击冲突解决程序。

  5. 如果冲突解决程序需要输入信息(例如列名),请在 “输入冲突解决程序所需的信息” 文本框中指定。

  6. 选择“确定”

  7. 对需要冲突解决程序的每个项目重复此过程。

“使用 Transact-SQL”

注册自定义冲突解决程序

  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 复制到分发服务器(对于推送订阅)或订阅服务器(对于请求订阅)。

      注意

      可以在 C:\Program Files\Microsoft SQL Server\nnn\COM 目录中找到 Microsoft 自定义解析程序。

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

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

    注意

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

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

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

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

  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),并记下所需自定义解析程序在结果集的“值”字段中的名称。

  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),并记下要删除的自定义解析程序在结果集的“值”字段中的名称。

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

示例 (Transact-SQL)

本示例创建了一个新项目,并指定当发生冲突时,将使用 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