6

我們最近從SQL Server 2005升級到SQL Server 2008(R2,SP1)。此升級包括一些出版物,其中所有表格均基於「稍後獲勝」原則與默認衝突解決程序一起發佈。它的智能名稱是'Microsoft SQL Server DATETIME(稍後贏得)衝突解析程序',並且相應的dll文件是ssrmax.dll。衆所周知,一旦使用衝突解決程序發佈了一個表,則必須在使用此表的所有後續發佈中使用相同的衝突解決程序。很公平,但是,當加入先前公佈的表格,新的出版物,並指定同樣的衝突解決程序用於這個表,我們正在一條錯誤消息:如何在從SQL-Server 2005升級到SQL-Server 2008時更新衝突解決程序

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. 

,試圖瞭解同一衝突解決不是由機器「一樣衝突解決」認爲,我發現有兩個衝突解決程序具有相同的名稱,不同的版本,在註冊表中:

th Ë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年的版本,這與之前的版本確實不同。

所以問題是:我怎麼才能讓服務器只考慮這兩個版本中的一個,並且這(當然)不必刪除並重新創建現有的出版物(這會使我們的生活變爲地獄,周)。

回答

0

那麼..所以沒人得到答案。但我認爲我(終於)明白了。猜猜......它是在元模型中的某個地方(像往常一樣)!

  • 將項目添加到訂閱時,存儲過程將使用來自[distribution]的新衝突解析程序引用。[MSmerge_articleresolver表
  • 但是,對於現有的訂閱,之前的衝突解決引用存儲在發佈數據庫,即[sysmergearticles],[sysmergeextendedarticlesview]的系統表和[sysmergepartitioninfoview]

因此,我們有在一側的項目initialy與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 

如此看來,我應該更新要麼在分發數據庫或引用發佈數據庫的引用。試一試吧!

+0

完成,工作。 –

0

謝謝,有類似的重新發布的用戶文章有一個CLSID在服務器上沒有意義(用Regedit查看),但是當試圖將文章添加到發佈會產生所述錯誤。

更新sysMergeArticles表的resolver_clsid字段與CLISD訂閱的文章,它試圖讓

{ 

declare @resolver_clsid nvarchar(50) 

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


select @resolver_clsid 

} 

,並可以再添加文章