我在 CDC 跟踪的 SQL Server 2019 实例中有一个表。但是,当我想重命名一列时,它会因错误而失败:
无法更改列“Columnn2”,因为它已“复制”。
我可以通过以下步骤解决该问题。
- 在桌子上禁用 CDC
- 更改列名
- Enable CDC on table 有没有更好的方法来解决这个问题?重现脚本:
CREATE DATABASE cdc_rename_error;
GO
USE cdc_rename_error;
GO
/*enable on database level*/
EXEC sys.sp_cdc_enable_db;
GO
/*create table*/
CREATE TABLE dbo.NewTable
(
ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
Column1 VARCHAR(50) NOT NULL,
Columnn2 VARCHAR(25) NULL
);
GO
/*enable cdc*/
EXEC sys.sp_cdc_enable_table @source_schema = N'dbo',
@source_name = N'NewTable',
@role_name = NULL;
/*try to rename table, which gives an error*/
EXEC sp_rename N'[dbo].[NewTable].[Columnn2]', N'Columnn2', N'COLUMN';
GO
/*cleanup*/
USE master;
GO
DROP DATABASE cdc_rename_error;
GO
不,至少不是更简单的方式,这就是 CDC 是如何通过设计实现的,如什么是变更数据捕获 (CDC)?- 处理对源表的更改:
我相信您当前在该表上禁用 CDC、进行更改和重新启用 CDC 的过程是正确的过程。
请注意,通过禁用和重新启用 CDC,您将丢失该表上的先前历史记录。通常建议将历史记录保存到临时表中,并在重新启用后将其重新插入新的 CDC 表中。有关如何处理此类情况的代码示例,请参阅 Erik Darling在 CDC 上的 GitHub 。