【问题标题】:How to update conflict resolver when upgrading from SQL-Server 2005 to SQL-Server 2008从 SQL-Server 2005 升级到 SQL-Server 2008 时如何更新冲突解决程序
【发布时间】:2012-06-14 05:13:41
【问题描述】:

我们最近从 SQL Server 2005 升级到 SQL Server 2008(R2、SP1)。此升级包括一些发布,其中所有表都使用基于“后来获胜”原则的默认冲突解决程序发布。它的智能名称是'Microsoft SQL Server DATETIME (Later Wins) Conflict Resolver',对应的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 D604B4B5-686B-4304-9613-C4F82B527B10

2008 版:

  • 文件 ssrmax.dll,
  • 版本 2009.100.2500.0,
  • cls_id 77209412-47CF-49AF-A347-DCF7EE481277

我检查了我们的 2008 服务器是否将第二个服务器视为“可用的自定义解析器”(我通过运行 sp_enumcustomresolvers 得到了这个)。问题是注册表中都有这两个引用,所以我猜旧出版物确实引用了 2005 版本,而新出版物尝试引用 2008 版本,这与以前的版本确实不同。

所以问题是:我怎样才能让服务器只考虑这两个版本中的一个,并且(当然)不必删除并重新创建现有的出版物(这将使我们的生活在接下来的 2 周内变成地狱) )。

【问题讨论】:

    标签: sql-server sql-server-2008 sql-server-2005 merge-replication resolver


    【解决方案1】:

    嗯..所以没有人得到答案。但我想我(终于)明白了。你猜怎么着......它在元模型中的某个地方(像往常一样)!

    • 向订阅添加项目时,存储过程要使用的新冲突解决程序引用来自 [distribution].[MSmerge_articleresolver] 表
    • 但是,对于现有订阅,以前的冲突解决程序引用存储在发布数据库的系统表中,即 [sysmergearticles]、[sysmergeextendedarticlesview] 和 [sysmergepartitioninfoview]

    因此,一方面,根据发布数据库元模型,我们有一个项目最初使用 SQLSERVER 2005 发布,其中发布引用了 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  
    

    所以看来我应该更新分发数据库中的引用或发布数据库中的引用。让我们试一试!

    【讨论】:

      【解决方案2】:

      谢谢,在重新发布者上遇到过类似的情况,其中订阅者文章的 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 
      
      }
      

      然后可以添加文章

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        相关资源
        最近更新 更多