消息详细信息
| 产品名称 | SQL Server |
| 事件编号 | 2627 |
| 事件源 | MSSQLSERVER |
| 组件 | SQL Server 数据库引擎 |
| 符号名称 | 无 |
| 消息正文 | 违反 %ls 约束 '%.*ls'。 无法在对象 '%.*ls' 中插入重复键。 |
说明
这是一个常规错误,无论数据库是否复制,都可以引发。 在复制的数据库中,通常会引发此错误,因为主键尚未在整个拓扑中适当管理。 在分布式环境中,必须确保不会将相同的值插入到位于多个节点的主键列或任何其他唯一列中。 可能的原因包括:
对行的插入和更新发生在多个节点上。 事务复制中的合并复制和可更新订阅都提供冲突检测和解决功能,但仍然建议仅在一个节点上插入或更新给定行。 点对点事务处理不提供冲突检测和解决; 它要求对插入和更新进行分区。
在应为只读的订阅者上插入了一行。 快照发布的订阅应被视为只读,事务发布的订阅同样应被视为只读,除非使用可更新的订阅或对等事务复制。
正在使用具有标识列的表,但该标识列未得到适当管理。
用户操作
所需的操作取决于引发错误的原因。
对行的插入和更新发生在多个节点上。
无论使用的复制类型如何,我们建议尽可能对插入和更新进行分区,因为这会减少冲突检测和解决所需的处理。 对于对等事务复制,需要对插入和更新进行分区。 如需更多信息,请参阅 对等事务复制。
在应为只读的订阅者上插入了一行。
除非使用合并复制、事务复制(具有可更新订阅)或对等事务复制,否则不要在订阅服务器上插入或更新行。
正在使用具有标识列的表,但该标识列未得到适当管理。
对于具有可更新订阅的合并复制和事务复制,应通过复制自动管理标识列。 对于对等事务复制,需要手动进行管理。 有关详细信息,请参阅 “复制标识列”。