【发布时间】:2011-03-15 23:31:36
【问题描述】:
如果我为表启用更改数据捕获,然后其他人向表中添加列,我的捕获会受到影响吗?我还会收到原始列的更新吗?对于新列?
如果一列被删除了怎么办?
【问题讨论】:
标签: sql-server-2008 change-data-capture
如果我为表启用更改数据捕获,然后其他人向表中添加列,我的捕获会受到影响吗?我还会收到原始列的更新吗?对于新列?
如果一列被删除了怎么办?
【问题讨论】:
标签: sql-server-2008 change-data-capture
(这个答案来自我的同事史蒂夫,但他没有 SO 帐户,所以我会发布它......)
如果您添加一列,CDC 不会更改...您将继续接收与以前相同的列集的更新。
如果您删除列,CDC 会继续捕获更改,但删除的列将始终具有值 NULL。
如果您 ALTER 列,CDC 会继续捕获更改,但更改后的列中的值将具有新的列类型。
【讨论】:
来自 MSDN 的 About Change Data Capture (SQL Server)
“处理对源表的更改 适应正在跟踪的源表中的列更改对于下游消费者来说是一个难题。尽管在源表上启用变更数据捕获并不能防止发生此类 DDL 变更,但变更数据捕获有助于减轻对消费者的影响,因为它允许通过 API 返回的交付结果集保持不变,即使基础源表更改。这种固定的列结构也反映在定义的查询函数访问的基础更改表中。 为了适应固定的列结构更改表,当源表启用更改数据捕获时,负责填充更改表的捕获进程将忽略未标识为捕获的任何新列。如果删除了跟踪的列,则将为后续更改条目中的列提供空值。但是,如果现有列的数据类型发生更改,则更改会传播到更改表,以确保捕获机制不会将数据丢失引入跟踪的列。捕获过程还将检测到的对跟踪表的列结构的任何更改发布到 cdc.ddl_history 表。希望提醒下游应用程序中可能必须进行的调整的消费者使用存储过程 sys.sp_cdc_get_ddl_history。 通常,当 DDL 更改应用于其关联的源表时,当前捕获实例将继续保持其形状。但是,可以为反映新列结构的表创建第二个捕获实例。这允许捕获过程将同一源表更改为具有两个不同列结构的两个不同的更改表。因此,虽然一个更改表可以继续为当前的操作程序提供数据,但第二个更改表可以驱动一个尝试合并新列数据的开发环境。允许捕获机制同时填充两个更改表意味着可以在不丢失更改数据的情况下完成从一个到另一个的转换。这可能在两个变更数据捕获时间线重叠的任何时候发生。当转换生效时,可以删除过时的捕获实例。 注意 注意 单个源表可以同时关联的最大捕获实例数为两个。”
【讨论】: