Eu tenho uma tabela em uma instância do SQL Server 2019 que está sendo rastreada pelo CDC. Porém quando quero renomear uma coluna ela falha com o erro:
Não é possível alterar a coluna 'Columnn2' porque é 'REPLICATED.
Eu posso contornar o problema com as seguintes etapas.
- Desabilitar CDC na tabela
- Alterar nome da coluna
- Habilitar CDC na tabela Existe uma maneira melhor de resolver esse problema? Script para reproduzir:
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
Não, pelo menos não de uma maneira mais simples, foi assim que o CDC foi implementado por design, conforme discutido em O que é captura de dados de alteração (CDC)? - Manipulação de alterações na tabela de origem :
Acredito que seu processo atual de desabilitar o CDC, fazer a alteração e reativar o CDC nessa tabela é o processo correto a seguir.
Observe que, ao desabilitar e reativar o CDC, você perderá o histórico anterior que tinha nessa Tabela. Geralmente, é recomendável salvar o histórico em uma tabela temporária e reinseri-lo na nova tabela CDC após a reativação. Veja o GitHub de Erik Darling no CDC para exemplos de código sobre como lidar com esse tipo de caso.