MSSQL_ENG002601

消息详细信息

产品名称

SQL Server

产品版本

9.0

产品内部版本号

9.00.1399.60

事件 ID

2601

事件源

MSSQLSERVER

组件

SQL Server 数据库引擎

符号名称

不适用

消息正文

不能在具有唯一索引 '%s' 的对象 '%s' 中插入重复键的行。

解释

这是一个常规错误,不管是否复制数据库,都会引发该错误。在已复制的数据库中,通常会引发该错误,因为尚未跨拓扑对主键进行适当的管理。在分布式环境中,确保没有将同一值插入到多个节点上的主键列或任何其他唯一列,这一点很重要。可能的原因包括:

  • 在多个节点上对行进行了插入和更新。合并复制和事务复制的可更新订阅都提供了冲突检测和解决,但是最好还是只在一个节点上插入或更新给定行。对等事务复制没有提供冲突检测和解决,它要求对插入和更新进行分区。
  • 在应该为只读的订阅服务器上插入了行。应该将快照发布的订阅服务器视为只读,就像事务发布的订阅服务器一样,除非使用了可更新的订阅或对等事务复制。
  • 使用了具有标识列的表,但是没有对该列进行适当的管理。
  • 在合并复制中,还可能在对系统表 MSmerge_contents 执行插入操作时发生此错误;发生的错误类似于如下所示:不能在具有唯一索引“ucl1SycContents”的对象“MSmerge_contents”中插入带有重复键的行。

用户操作

所需操作取决于引发错误的原因:

  • 在多个节点上对行进行了插入和更新。
    不管使用哪种复制类型,我们都建议您尽可能地对插入和更新进行分区,因为这样可以减少检测和解决冲突所需的处理操作。对于对等事务复制,需要对插入和更新进行分区。有关详细信息,请参阅对等事务复制
  • 在应该为只读的订阅服务器上插入了行。
    除非使用合并复制、具有可更新订阅的事务复制或对等事务复制,否则不要在订阅服务器上插入或更新行。
  • 使用了具有标识列的表,但是没有对该列进行适当的管理。
    对于合并复制和具有可更新订阅的事务复制,标识列应该由复制自动管理。对于对等事务复制,必须手动进行管理。有关详细信息,请参阅复制标识列
  • 此错误在系统表 MSmerge_contents 中进行插入时发生。
    发生此错误的原因是联接筛选器属性 join_unique_key 的值不正确。仅当父表中的联接列唯一时,才应将此属性设置为 TRUE。如果此属性设置为 TRUE,而该列不唯一,则引发此错误。有关如何设置此属性的详细信息,请参阅如何定义和修改合并项目间的联接筛选器 (SQL Server Management Studio)How to: Define and Modify a Join Filter Between Merge Articles (Replication Transact-SQL Programming)

请参阅

概念

复制错误的原因和解决方法

帮助和信息

获取 SQL Server 2005 帮助