如何在新添加的基础表列上激活更改数据捕获(CDC),而不禁用CDC

时间:2016-07-26 10:13:42

标签: sql sql-server cdc

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

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

除了上述内容,我需要一个解决方案,我可以在启用CDC的同时将新列包含在CDC表中。

2 个答案:

答案 0 :(得分:6)

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

  1. 添加新列
  2. 添加新的cdc-capture inctance
  3. 将数据从旧表移至新表
  4. 禁用旧的cdc实例
  5. 此解决方案可以阻止您停止收集更改,并且不会丢失数据。

    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'
    

答案 1 :(得分:1)

当您在目标表上有一个实例时,上面的解决方案很有效,但如果您已经有两个实例,则可能需要稍微考虑一下并使用一些规划。

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

  1. 将所有当前_CT数据传输到终点。

  2. 禁用表格上的当前实例(sp_cdc_disable_table)

  3. 使用更新的列列表(sp_cdc_enable_table)再次启用实例

  4. 即使两个实例已经定位到同一个表而不丢失客户端数据,这也允许进行更改。

    注意:列列表参数的使用并不是一个要求(如果您希望捕获所有列),但是当其他开发人员可能需要查看代码时,它可能更适合于一致性。尽管如此,通过cdc.X系统表获取数据同样容易。