SQLServer开启CDC之后 修改表字段的时候报错:ODBC Driver17 for SQLServer 不能在具有唯一索引的对象中插入重复键的行,重复键值为688057537

tony carl 0 信誉分
2025-11-19T09:06:44.3533333+00:00

SQLServer开启CDC之后 修改表字段的长度,比如把varchar(500) 改到varchar(501)会报错:

ODBC Driver17 for SQLServer 不能在具有唯一索引的对象中插入重复键的行,重复键值为688057537。

关闭CDC之后就不会有这个问题。

版本信息如下:

Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Enterprise Edition (64-bit) on Windows Server 2019 Datacenter 10.0 <X64> (Build 17763: ) (Hypervisor)

SQL Server 数据库引擎
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Dinesh Yadlapalli 0 信誉分 Microsoft 外部员工 仲裁人
    2025-12-02T09:31:04.3433333+00:00

    你好,@tony carl,

    感谢您联系Microsoft问答论坛。

    这个问题与SQL Server内部变更数据捕获(CDC)的工作方式有关。启用CDC后,SQL Server会创建系统表并使用捕获实例跟踪变更。这些表通常在元数据列如__$start_lsn和__$seqval上有唯一的索引。

    当你更改像varchar(500)-->varchar(501)这样的列长时,SQL Server内部只对元数据进行更改。然而,启用CDC后,系统会尝试将这些变更记录在CDC表中。

    CDC采用基于日志的捕获,在模式变更时,可能会尝试在内部变更表中插入重复键,因为模式修改会触发类似复制的进程。

    错误通常指的是CDC变更表中唯一的索引,如cdc,无法插入带有重复键的行。<capture_instance>_CT,其中重复的键值(688057537)对应内部的LSN或序列值。

    请尝试以下的变通方法。

    1. 在更改列之前,先禁用CDC。下级行动。

    EXEC sys.sp_cdc_disable_table @source_schema = 'schema_name',@source_name = 'table_name',@capture_instance = 'capture_instance_name';

    执行 ALTER TABLE作。

    重新启用CDC:

    EXEC sys.sp_cdc_enable_table @source_schema = 'schema_name',@source_name = 'table_name',@role_name = 无;

    1. 使用WITH (ONLINE = ON),对于某些作,在线模式变更可以减少CDC冲突,但这有限。
    2. 检查CDC的捕获和清理任务是否运行,没有卡住。过时的LSN值可能导致键重复问题。
    3. 升级SQL Server或应用最新的CU,你的版本是SQL Server 2019 RTM(15.0.2000.5),这是初始版本。这个问题在早期版本中就已知。

    应用最新的 SQL Server 2019 累积更新(CU)。许多与CDC相关的漏洞在后续的信用合作单元中得到了修复。

    注意:在影响列定义的模式变更前,务必禁用CDC,然后重新启用。

    希望这些信息对你有帮助。如果您有任何进一步的问题,请随时告诉我们。

     

    问候

    迪内什

    0 个注释 无注释

你的答案

提问者可以将答案标记为“已接受”,版主可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。