Phi*_*ier 6 sql-server sql-server-2005 resolver sql-server-2008 merge-replication
我们最近从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
Run Code Online (Sandbox Code Playgroud)
这是我们得到的错误:
The article '...' already exists in another publication with a different article resolver.
Run Code Online (Sandbox Code Playgroud)
通过尝试了解同一冲突解析器如何被机器视为"相同的冲突解决程序",我发现在注册表中有两个具有相同名称,不同版本的冲突解决程序:
2005版:
2008版:
我检查了我们的2008服务器正在考虑第二个作为'可用的自定义解析器'(我通过运行sp_enumcustomresolvers得到了这个).问题是两个引用都可以在注册表中找到,所以我猜旧的出版物确实引用了2005版本,而新的出版物试图引用2008版本,这确实与前一版本不同.
所以问题是:我怎样才能让服务器只考虑这两个版本中的一个,而这(当然)不必丢弃并重新创建现有的出版物(这将使我们的生活在接下来的两周内变成地狱).
好吧..所以没有人得到答案。但我想我(终于)明白了。你猜怎么着......它在元模型中的某个地方(像往常一样)!
因此,我们一方面有一个最初使用 SQLSERVER 2005 发布的项目,其中该发布引用了 2005 冲突解决程序,根据发布数据库元模型。另一方面,机器将尝试将相同的项目添加到新的发布中,这次默认引用分发数据库中可用的冲突解决程序,这确实与 2005 年的不同......
为了说明这一点,您可以检查以下内容
USE distribution
go
SELECT article_resolver, resolver_clsid
FROM [MSmerge_articleresolver] WHERE article_resolver like '%Later Wins%'
GO
Run Code Online (Sandbox Code Playgroud)
然后,
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
Run Code Online (Sandbox Code Playgroud)
所以看来我应该更新分发数据库中的引用或发布数据库中的引用。试一试吧!
| 归档时间: |
|
| 查看次数: |
879 次 |
| 最近记录: |