如何在不禁用 CDC 的情况下在基础 table 的新添加列上激活更改数据捕获 (CDC)

How to activate Change Data Capture (CDC) on newly added columns of underlying table without disabling CDC

我有一个要求,我想在 table 的新添加的列上启用 CDC,但我无法禁用 CDC 并再次启用它。有什么办法可以实现吗?

我找到了一个解决方案,我可以将旧的 CDC table 值复制到临时 table,然后禁用 CDC,然后使用新的 table 架构启用 CDC。稍后将临时 table 值复制到新的 CDC table 并更新 LSN 值。

我需要一个解决方案,而不是上面的解决方案,我可以在启用 CDC 的同时将新列包含到 CDC table。

CDC 支持两个捕获实例 tables。因此,您可以执行以下步骤:

  1. 添加新列
  2. 添加新的 cdc-capture inctance
  3. 将数据从旧 table 移动到新
  4. 禁用旧的 cdc 实例

此解决方案可防止您停止收集更改并且不会丢失数据。

EXEC sp_cdc_enable_table
    @source_schema = N'common',
    @source_name = N'EntityTypes',
    @role_name = NULL,
    @filegroup_name = N'CDC',
    @capture_instance = 'common_EntityTypes'


ALTER TABLE common.EntityTypes
    ADD TestColumn int

EXEC sp_cdc_enable_table
    @source_schema = N'common',
    @source_name = N'EntityTypes',
    @role_name = NULL,
    @filegroup_name = N'CDC',
    @capture_instance = 'common_EntityTypes2'

INSERT INTO cdc.common_EntityTypes2_CT
(__$start_lsn, __$end_lsn,__$seqval,__$operation,__$update_mask,Id,Name)
SELECT
    __$start_lsn, 
    __$end_lsn,
    __$seqval,
    __$operation,
    __$update_mask,
    Id,
    Name
FROM cdc.common_EntityTypes_CT

EXEC sp_cdc_disable_table
    @source_schema = N'common',
    @source_name = N'EntityTypes',
    @capture_instance = 'common_EntityTypes'

当您在目标 table 上只有一个实例时,上面的解决方案很有效,但如果您已经有两个实例,您可能需要考虑得更远一些,并进行一些规划。

数据丢失的问题很重要,但您可能会在最初设计 cdc 流程时考虑这个问题,一个非常相关的项目是,数据的终点是什么?例如,如果您正在使用 BI 解决方案,可能使用仓库或简单的 OLAP DB(如数据集市)作为报告解决方案,那么您可能会考虑引入维护 windows 或利用当前维护 window.这个过程很简单,与 Backs 的回答没有什么不同:

  1. 将当前_CT数据全部传输到终点。

  2. 禁用 table (sp_cdc_disable_table)

  3. 上的当前实例
  4. 使用更新后的列列表再次启用实例 (sp_cdc_enable_table)

这允许更改生效,即使两个实例已经针对相同的 table 而不会丢失客户端数据。

注意:列列表参数的使用并不是必需的(如果您希望捕获所有列),但当其他开发人员可能需要审查代码时,为了保持一致性,它可能更可取。尽管如此,通过 cdc.X 系统 tables.

获取数据同样容易