You need to enable JavaScript to run this app. 对启用CDC的源表重复增删列时,CDC.ddl_history表报主键冲突错误
优惠活动
大模型
产品
解决方案
定价
更多

对启用CDC的源表重复增删列时,CDC.ddl_history表报主键冲突错误

CDC启用表重复执行同名列新增操作触发ddl_history主键冲突问题

复现流程

  • 前置条件:待操作源表已开启SQL Server CDC功能
  • 触发异常的操作序列:
    1. 为源表新增一列
    2. 直接删除刚新增的列
    3. 再次为源表新增与已删除列同名称的列
  • 异常触发节点:第三步操作执行时,系统写入CDC DDL审计记录的环节报错

报错详情

违反主键约束ddl_history_clustered_idx,无法向对象cdc.ddl_history中插入重复键,对应的重复键值为(684281943, 0x000025d50023c0a80062)

问题根因

cdc.ddl_history表的主键构成逻辑为「源表对象ID + DDL操作关联对象的二进制哈希值」。当执行“新增列-删除列-同名列重新新增”的操作序列时,删除列的操作不会清除之前写入的DDL审计记录,且同名称列重新生成的二进制哈希值与第一次新增时完全一致,导致第二次写入时命中主键唯一约束。

解决方法

  • 临时规避方案
    同名称列删除后,不要直接重新新增目标列,可先创建带临时后缀的列,等待至少1个CDC日志扫描周期后,再通过重命名操作将列名恢复为目标名称,绕开哈希值重复的问题
  • 永久修复方案
    1. 升级SQL Server实例到对应版本的累计更新(CU):该问题已在SQL Server 2016 SP2 CU15、SQL Server 2017 CU23、SQL Server 2019 CU9及后续官方版本中完成修复
    2. 无法立即升级实例时,可在执行同名列新增操作前,手动删除cdc.ddl_history中对应旧列变更的重复记录

注意:手动修改CDC系统表前必须完成全量备份,避免审计记录损坏


内容的提问来源于stack exchange,提问作者sojitra khushbu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 08:24:04