你好,@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或序列值。
请尝试以下的变通方法。
- 在更改列之前,先禁用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 = 无;
- 使用WITH (ONLINE = ON),对于某些作,在线模式变更可以减少CDC冲突,但这有限。
- 检查CDC的捕获和清理任务是否运行,没有卡住。过时的LSN值可能导致键重复问题。
- 升级SQL Server或应用最新的CU,你的版本是SQL Server 2019 RTM(15.0.2000.5),这是初始版本。这个问题在早期版本中就已知。
应用最新的 SQL Server 2019 累积更新(CU)。许多与CDC相关的漏洞在后续的信用合作单元中得到了修复。
注意:在影响列定义的模式变更前,务必禁用CDC,然后重新启用。
希望这些信息对你有帮助。如果您有任何进一步的问题,请随时告诉我们。
问候
迪内什