对启用CDC的源表重复增删列时,CDC.ddl_history表报主键冲突错误
CDC启用表重复执行同名列新增操作触发ddl_history主键冲突问题
复现流程
- 前置条件:待操作源表已开启SQL Server CDC功能
- 触发异常的操作序列:
- 为源表新增一列
- 直接删除刚新增的列
- 再次为源表新增与已删除列同名称的列
- 异常触发节点:第三步操作执行时,系统写入CDC DDL审计记录的环节报错
报错详情
违反主键约束
ddl_history_clustered_idx,无法向对象cdc.ddl_history中插入重复键,对应的重复键值为(684281943, 0x000025d50023c0a80062)
问题根因
cdc.ddl_history表的主键构成逻辑为「源表对象ID + DDL操作关联对象的二进制哈希值」。当执行“新增列-删除列-同名列重新新增”的操作序列时,删除列的操作不会清除之前写入的DDL审计记录,且同名称列重新生成的二进制哈希值与第一次新增时完全一致,导致第二次写入时命中主键唯一约束。
解决方法
- 临时规避方案
同名称列删除后,不要直接重新新增目标列,可先创建带临时后缀的列,等待至少1个CDC日志扫描周期后,再通过重命名操作将列名恢复为目标名称,绕开哈希值重复的问题 - 永久修复方案
- 升级SQL Server实例到对应版本的累计更新(CU):该问题已在SQL Server 2016 SP2 CU15、SQL Server 2017 CU23、SQL Server 2019 CU9及后续官方版本中完成修复
- 无法立即升级实例时,可在执行同名列新增操作前,手动删除
cdc.ddl_history中对应旧列变更的重复记录
注意:手动修改CDC系统表前必须完成全量备份,避免审计记录损坏
内容的提问来源于stack exchange,提问作者sojitra khushbu
相关产品推荐
相关产品推荐

