Sql server 从SQL Server 2005升级到SQL Server 2008时如何更新冲突解决程序

Sql server 从SQL Server 2005升级到SQL Server 2008时如何更新冲突解决程序,sql-server,sql-server-2008,sql-server-2005,merge-replication,resolver,Sql Server,Sql Server 2008,Sql Server 2005,Merge Replication,Resolver,我们最近已从SQLServer2005升级到SQLServer2008(R2,SP1)。此升级包括一些发布,其中所有表都使用基于“以后的wins”原则的默认冲突解决程序发布。它的智能名称是“Microsoft SQL Server DATETIME(以后的Wins)冲突解决程序”,相应的dll文件是ssrmax.dll 众所周知,一旦使用冲突解决程序发布了一个表,以后所有使用该表的发布中都必须使用相同的冲突解决程序。很公平,但是,当将以前发布的表添加到新发布中,并指定用于此表的完全相同的冲突解决

我们最近已从SQLServer2005升级到SQLServer2008(R2,SP1)。此升级包括一些发布,其中所有表都使用基于“以后的wins”原则的默认冲突解决程序发布。它的智能名称是“Microsoft SQL Server DATETIME(以后的Wins)冲突解决程序”,相应的dll文件是ssrmax.dll

众所周知,一旦使用冲突解决程序发布了一个表,以后所有使用该表的发布中都必须使用相同的冲突解决程序。很公平,但是,当将以前发布的表添加到新发布中,并指定用于此表的完全相同的冲突解决程序时,我们会收到一条错误消息:

use [myDb]
exec sp_addmergearticle 
    @publication = N'myDb_Pub', 
    @article = N'Tbl_blablabla', 
    @source_owner = N'dbo', 
    @source_object = N'Tbl_blablabla', 
    @type = N'table', 
    @description = N'', 
    @creation_script = N'', 
    @pre_creation_cmd = N'drop', 
    @schema_option = 0x000000000C034FD1, 
    @identityrangemanagementoption = N'none', 
    @destination_owner = N'dbo', 
    @force_reinit_subscription = 1, 
    @column_tracking = N'false', 
    @article_resolver = N'Microsoft SQL Server DATETIME (Later Wins) Conflict Resolver', 
    @subset_filterclause = N'', 
    @resolver_info = N'ddmaj', 
    @vertical_partition = N'false', 
    @verify_resolver_signature = 0, 
    @allow_interactive_resolver = N'false', 
    @fast_multicol_updateproc = N'true', 
    @check_permissions = 0, 
    @subscriber_upload_options = 0, 
    @delete_tracking = N'true', 
    @compensate_for_errors = N'false', 
    @stream_blob_columns = N'false', 
    @partition_options = 0
GO
这就是我们得到的错误:

The article '...' already exists in another publication with a different article resolver.
通过尝试理解机器如何不将同一冲突解决程序视为“同一冲突解决程序”,我发现注册表中有两个名称相同、版本不同的冲突解决程序:

2005年版本:

  • 文件ssrmax.dll
  • 版本2005.90.4035.0
  • cls_id D604B5-686B-4304-9613-C4F82B527B10
2008年版本:

  • 文件ssrmax.dll
  • 版本2009.100.2500.0
  • cls_id 77209412-47CF-49AF-A347-DCF7EE481277
我检查了我们的2008服务器是否将第二个视为“可用的自定义解析器”(我是通过运行sp_enumcustomresolvers获得的)。问题是,这两个参考文献都可以在注册表中找到,因此我猜旧出版物确实是指2005年版本,而新出版物则试图指2008年版本,这与以前的版本确实不同


问题是:我怎么能让服务器只考虑这2个版本中的一个,当然(当然)不必删除并重新创建现有的出版物(这将使我们的生活在接下来的2个星期变成地狱)。p> 嗯。。所以没有人得到答案。但我想我(终于)明白了。猜猜看。。。它在元模型的某个地方(像往常一样)

  • 将项添加到订阅时,存储过程要使用的新冲突解决程序引用来自[distribution].[MSmerge\u articleresolver]表
  • 但是,对于现有订阅,以前的冲突解决程序引用存储在发布数据库的系统表中,即[sysmergearticles]、[sysmergeextendedarticlesview]和[SysMergePartitionInfo]中
因此,我们有一个使用SQLServer2005初始发布的项目,根据发布数据库元模型,该发布引用了2005冲突解决程序。另一方面,计算机将尝试向新发布中添加相同的项,这一次使用分发数据库中可用的冲突解决程序的默认引用,这与2005年的冲突解决程序确实不同

为了说明这一点,您可以检查以下内容

USE distribution
go
SELECT article_resolver, resolver_clsid
  FROM [MSmerge_articleresolver] WHERE article_resolver like '%Later Wins%'
  GO
那么

USE myPublicationDatabase
go
SELECT article_resolver, resolver_clsid
  FROM [sysmergearticles] WHERE article_resolver like '%Later Wins%'
  GO
 SELECT article_resolver, resolver_clsid
  FROM [sysmergeextendedarticlesview] WHERE article_resolver like '%Later Wins%'
  GO
 SELECT article_resolver, resolver_clsid
  FROM [sysmergepartitioninfoview] WHERE article_resolver like '%Later Wins%'
  GO  

因此,我似乎应该更新分发数据库中的引用或发布数据库中的引用。让我们试一试吧

谢谢,在重新发布时,订阅方文章的CLSID在服务器上没有任何意义(使用Regedit查看),但在尝试将文章添加到发布时会产生上述错误

使用尝试获取的clisd更新了订阅文章的sysMergeArticles表的resolver_clsid字段

{

declare @resolver_clsid  nvarchar(50)

 exec sys.sp_lookupcustomresolver N'Microsoft SQL Server DATETIME (Earlier Wins) Conflict Resolver', @resolver_clsid OUTPUT


 select @resolver_clsid 

}
然后可以添加该文章