Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在不禁用CDC的情况下对基础表的新添加列激活更改数据捕获(CDC)_Sql_Sql Server_Cdc - Fatal编程技术网

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

Sql 如何在不禁用CDC的情况下对基础表的新添加列激活更改数据捕获(CDC),sql,sql-server,cdc,Sql,Sql Server,Cdc,我需要在表的新添加列上启用CDC,但不能禁用CDC并再次启用它。我有什么办法可以做到这一点吗 我找到了一个解决方案,可以将旧的CDC表值复制到临时表中,然后禁用CDC,然后使用新表模式启用CDC。稍后将临时表值复制到新的CDC表中并更新LSN值 我需要一个解决方案,在启用CDC时,可以将新列包含到CDC表中。CDC支持两个捕获表实例。因此,您可以执行以下步骤: 添加新列 添加新的cdc捕获实例 将数据从旧表移动到新表 禁用旧cdc实例 此解决方案可防止您停止收集更改,并且不会丢失数据 EXEC

我需要在表的新添加列上启用CDC,但不能禁用CDC并再次启用它。我有什么办法可以做到这一点吗

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


我需要一个解决方案,在启用CDC时,可以将新列包含到CDC表中。

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

  • 添加新列
  • 添加新的cdc捕获实例

  • 将数据从旧表移动到新表
  • 禁用旧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'
    

    当目标表上只有一个实例时,上面的解决方案效果很好,但如果已经有两个实例,则可能需要进一步考虑并使用一些计划

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

  • 将所有当前CT数据传输到端点

  • 禁用表上的当前实例(sp\U cdc\U Disable\U table)

  • 使用更新的列列表(sp_cdc_Enable_表)再次启用实例

  • 这样,即使两个实例已经以同一个表为目标,并且没有丢失客户机数据,也可以实现更改


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

    可能重复@M.Hassan我不想在任何情况下在添加新列时禁用cdc。但是,当我对新添加的列“TestColumn”执行DDL操作时,新创建的实例cdc.common_entitypes2_CT中不会捕获更改“将数据从旧表移动到新表”。说“将ETL过程移动到新CDC实例中”是否更准确"? 也就是说,您可以通过使用第二个实例的min LSN作为第一个捕获实例的端点来衔接这两个实例。处理完第一个端点之前(包括第一个端点)的所有记录后,将ETL切换到第二个端点,并从那里继续处理。就我个人而言,我喜欢使用抽象(即同义词或视图)来隐藏我正在切换CDC实例的事实。@Mohan您必须在添加新实例后创建新的CDC实例column@BenThul是的,这是可能的解决办法之一。在我们的项目中,我们使用一个视图,但我不知道在这种情况下的所有要求我知道这是关于添加新列的,但删除列时也要小心,因为它们会影响基于历史掩码更改的列的精确计算。很容易忘记,过去在添加新列之前,有时会删除一列。一旦您禁用并重新启用cdc,您的历史遮罩就会失效,因为它们反映了当时有效的结构。解决方案是在每次插入/更新时保存列列表。或者在某个地方拍摄表结构的快照并引用它。