我们最近从 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 版,这确实与以前的不同。
所以问题是:我怎样才能让服务器只考虑这两个版本中的一个,并且(当然)不必删除并重新创建现有的出版物(这将使我们的生活在接下来的两周内变成地狱)。