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

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

本主题内容

开始之前

建议

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

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

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

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

    • 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\120\COM 目录中找到 Microsoft 自定义冲突解决程序。

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

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

    注意

    合并代理可执行文件的默认安装位置为 C:\Program Files\Microsoft SQL Server\120\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

另请参阅

Advanced Merge Replication Conflict Detection and Resolution
为合并项目实现业务逻辑处理程序