本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中指定合并项目解析程序。
本主题内容
准备工作:
若要指定合并项目解析程序,请使用:
在您开始之前
建议
合并复制允许以下类型的项目解析程序:
默认解析程序。 默认解析程序的行为取决于订阅是客户端订阅还是服务器订阅。 有关指定订阅类型的详细信息,请参阅指定合并订阅类型和冲突解决优先级(SQL Server Management Studio)。
你编写的自定义解析程序,可以是业务逻辑处理程序(用托管代码编写)或基于 COM 的自定义解析程序。 有关详细信息,请参阅 高级合并复制冲突检测和解决。 如果需要实现为每个复制行执行的自定义逻辑,而不仅仅是针对冲突行,请参阅 “为合并项目实现业务逻辑处理程序”。
一个基于 COM 的标准解析程序,它包含在 MICROSOFT SQL Server 中。
若要使用默认解析程序以外的解析程序,必须将解析程序复制到运行合并代理的计算机并注册它(如果使用业务逻辑处理程序,还必须在发布服务器上注册该解析程序)。 合并代理在以下位置运行:
推送订阅的分发者
请求订阅的订阅服务器
使用 Web 同步进行拉取订阅的 Microsoft Internet Information Services (IIS) 服务器
使用 SQL Server Management Studio
注册解析程序后,指定项目应在“项目属性 - <项目>”对话框的“冲突解决程序”选项卡上使用解析程序,该对话框在“新建发布向导”和“发布属性 - <发布>”对话框中可用。 有关使用向导和访问对话框的详细信息,请参阅 创建发布 和 查看和修改发布属性。
指定解析程序
在“新建发布向导”的“文章”页或“发布属性 - <发布>”对话框中,选择一个表。
单击“ 项目属性”,然后单击“ 设置突出显示的表项目的属性”。
在“ 项目属性 - <项目> ”页上,单击“ 解析程序 ”选项卡。
选择 “使用自定义解析程序”(在分发服务器上注册),然后在列表中单击解析程序。
如果解析程序需要输入(如列名),请在 解析程序文本框所需的 Enter 信息 中指定它。
单击 “确定” 。
对需要解析程序的每个项目重复此过程。
使用 Transact-SQL
注册自定义冲突解决程序
如果计划注册自己的自定义冲突解决程序,请创建以下类型之一:
托管基于代码的解析程序作为业务逻辑处理程序。 有关详细信息,请参阅 为合并项目实现业务逻辑处理程序。
基于存储过程的解析程序和基于 COM 的解析程序。 有关详细信息,请参阅 为合并项目实现自定义冲突解决程序。
若要确定所需的解析程序是否已注册,请在发布服务器上对任何数据库执行sp_enumcustomresolvers(Transact-SQL)。 这将显示在分发服务器上注册的每个基于 COM 的解析程序的自定义解析程序说明及其类标识符(CLSID),或在分发服务器上注册的每个业务逻辑处理程序的托管程序集的信息。
如果尚未注册所需的自定义解析程序,请在分发服务器上执行sp_registercustomresolver(Transact-SQL)。 指定 @article_resolver解析程序的名称;对于业务逻辑处理程序,这是程序集的友好名称。 对于基于 COM 的解析程序,请为 @resolver_clsid 指定 DLL 的 CLSID,并为业务逻辑处理程序指定@is_dotnet_assembly的值
true、@dotnet_assembly_name程序集的名称以及替代BusinessLogicModule@dotnet_class_name的类的完全限定名称。注释
如果业务逻辑处理程序程序集未部署在与合并代理可执行文件相同的目录、与同步启动合并代理的应用程序相同的目录中,或者未部署在全局程序集缓存(GAC)中,则需要为 @dotnet_assembly_name 指定包含程序集名称的完整路径。
如果解析程序是基于 COM 的解析程序:
将自定义解析程序 DLL 复制到分发服务器以进行推送订阅,或复制到订阅服务器以进行拉取订阅。
注释
可以在 C:\Program Files\Microsoft SQL Server\120\COM 目录中找到Microsoft自定义解析程序。
使用 regsvr32.exe 向操作系统注册自定义解析程序 DLL。 例如,从命令提示符执行以下命令会注册 SQL Server 累加冲突解决程序:
regsvr32 ssradd.dll
如果解析程序是业务逻辑处理程序,请在与调用合并代理的应用程序相同的文件夹中或步骤 3 中为 @dotnet_assembly_name 参数指定的文件夹中部署程序集(replmerg.exe)。
注释
合并代理可执行文件的默认安装位置为 C:\Program Files\Microsoft SQL Server\120\COM。
定义合并项目时指定自定义解析程序
如果计划使用自定义冲突解决程序,请使用上述过程创建和注册冲突解决程序。
在发布服务器上,执行 sp_enumcustomresolvers(Transact-SQL), 并在结果集 的值 字段中记下所需的自定义解析程序的名称。
在发布服务器上,对发布数据库执行sp_addmergearticle(Transact-SQL)。 为@article_resolver指定步骤 2 中解析器的名称,并使用@resolver_info参数为自定义解析程序提供任何必需的输入。 对于基于存储过程的自定义解析程序, @resolver_info 是存储过程的名称。 有关Microsoft提供的解析程序所需的输入的详细信息,请参阅 Microsoft COM-Based 解析程序。
指定或更改现有合并项目自定义解析程序
若要确定是否已为项目定义自定义解析程序,或获取解析程序的名称,请执行 sp_helpmergearticle(Transact-SQL)。 如果为项目定义了自定义解析程序,则其名称将显示在 article_resolver 字段中。 提供给解析程序的任何输入将显示在结果集 的resolver_info 字段中。
在发布服务器上,执行 sp_enumcustomresolvers(Transact-SQL), 并在结果集 的值 字段中记下所需的自定义解析程序的名称。
在Publisher的发布数据库上,执行sp_changemergearticle(Transact-SQL)。 指定 article_resolver值,包括业务逻辑处理程序的完整路径、 @property,以及步骤 2 中所需自定义解析程序的名称,以便 @value。
若要更改自定义解析程序的任何必需输入,请再次执行sp_changemergearticle(Transact-SQL)。 为 @property 指定 resolver_info 值,并为 @value的自定义解析程序指定任何必需的输入。 对于基于存储过程的自定义解析程序, @resolver_info 是存储过程的名称。 有关所需输入的详细信息,请参阅 Microsoft COM-Based 解析器。
取消注册自定义冲突解决程序
在发布者上,执行 sp_enumcustomresolvers(Transact-SQL),并在结果集的 值 字段中记下要删除的自定义解析程序的名称。
在分发服务器上执行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