SQL SERVER2005 复制失败

 

时间:2012-02-14

错误现象:

 

尝试的命令:
if @@trancount > 0 rollback tran
(事务序列号: 0x0000D32900004BF9000600000000,命令 ID: 1)

错误消息:
违反了 PRIMARY KEY 约束 'PK_dv_topic'。不能在对象 'dbo.dv_topic' 中插入重复键。 (源: MSSQLServer,错误号: 2627)
获取帮助: http://help/2627 违反了 PRIMARY KEY 约束 'PK_dv_topic'。不能在对象 'dbo.dv_topic' 中插入重复键。 (源: MSSQLServer,错误号: 2627)
获取帮助: http://help/2627

 

 

检查:

1、重新初始化发布快照,并重新管理该表的主键。

因为该库使用了全文索引,并且在该表的主键列上创建了全文索引。而启用复制时,将库的全文索引禁用了。

故而考虑的解决方式是重新启用全文索引,然后禁用表主键使用全文索引,再禁用库全文索引。然后重新发布即可。

 但依然没有效果。

 

2、检查订阅服务器,因之前订阅服务器上的数据并不是在复制时完全生成,到时某些表的数据多次重复插入(具体原因待查)。

不得已,再保证好发布数据库中的表以及表本身的约束比较规范的情况下,删除并重建了订阅库,最后重新启动复制。

 

解决:

最后发现有一个定时任务,不知何时运行的,每隔15分钟就从发布库向订阅库写入新数据。就是这个定时任务导致的。

停用之。并重新初始化。恢复正常。

 

总结:

按理说,事务复制时,订阅库跟发布库应该是完全一致的,实际上,并不完全是:

1)发布库中表各列的默认值无法复制到订阅库。(因此,希望从订阅库备份数据恢复为主库的,这条路就不要考虑了,否则后果自负。)

2)发布库中表的约束要确保规范。不然就会出现重复发布数据的错误。

3)如果订阅库中已有数据,很可能是其他会话向定阅服务器写入

 

解决办法:在项目中修改为删除行对应数据项