cdc.<capture_instance>_CT (Transact-SQL)

对源表启用变更数据捕获时创建的更改表。该表为对源表执行的每个插入和删除操作返回一行,为对源表执行的每个更新操作返回两行。如果在启用源表时未指定更改表的名称,则会使用一个派生的名称。该名称的格式为 cdc.capture_instance_CT,其中 capture_instance 是源表的架构名称以及格式为 schema_table 的源表名称。例如,如果 AdventureWorks2008R2 示例数据库中的表 Person.Address 启用了变更数据捕获,则派生的更改表名称将为 cdc.Person_Address_CT

我们建议您不要直接查询系统表,而应执行 cdc.fn_cdc_get_all_changes_<捕获实例>cdc.fn_cdc_get_net_changes_<捕获实例> 函数。

列名

数据类型

说明

__$start_lsn

binary(10)

与相应更改的提交事务关联的日志序列号 (LSN)。

在同一事务中提交的所有更改将共享同一个提交 LSN。例如,如果对源表的删除操作将源表删除了两行,则更改表将包含两行,每一行均具有相同的 __$start_lsn 值。

__$end_lsn

binary(10)

标识为仅供参考。不提供支持。不保证以后的兼容性。

在 SQL Server 2008 中,此列始终为 NULL。

__$seqval

binary(10)

用于对事务内的行更改进行排序的序列值。

__$operation

int

标识与相应更改关联的数据操作语言 (DML) 操作。可以是下列值之一:

1 = 删除

2 = 插入

3 = 更新(旧值)

列数据中具有执行更新语句之前的行值。

4 = 更新(新值)

列数据中具有执行更新语句之后的行值。

__$update_mask

varbinary(128)

基于更改表的列序号的位掩码,用于标识那些发生更改的列。

<已捕获的源表列>

不定

更改表中的其余列是在创建捕获实例时源表中标识为已捕获列的那些列。如果已捕获列的列表中未指定任何列,则源表中的所有列将包括在此表中。

注释

已捕获列的数据类型

此表中包含的已捕获列具有与其对应源列相同的数据类型和值,但下述情况例外:

  • Timestamp 列的数据类型被定义为 binary(8)。

  • Identity 列的数据类型被定义为 int 或 bigint。

不过,这些列中的值与源列的值相同。

大型对象数据类型

对于 LOB 数据类型 varchar(max)、nvarchar(max)、varbinary(max)、image、text、ntext 和 xml,仅当在更新过程中列实际发生更改时,旧值才会出现在更新(旧值)行中。对于其他数据类型,此列值始终会显示在两个更新行中。

默认情况下,在一个 INSERT、UPDATE、WRITETEXT 或 UPDATETEXT 语句中可添加到已捕获列的最大大小为 65,536 字节或 64 KB。若要增加此大小以支持较大的 LOB 数据,请使用 max text repl size 选项指定一个更大的最大大小值。有关详细信息,请参阅如何配置 max text repl size 选项 (SQL Server Management Studio)

数据定义语言修改

对源表所做的 DDL 修改(如添加或删除列)记录在 cdc.ddl_history 表中。这些更改不会应用于更改表。也就是说,更改表的定义保持不变。当向更改表中插入行时,捕获进程将忽略那些未显示在与源表关联的已捕获列的列表中的列。如果某列出现在已捕获列的列表中,但已不再位于源表中,则会为该列指定一个 null 值。

对源表中某列的数据类型的更改也会记录在 cdc.ddl_history 表中。但是,此更改不会改变更改表的定义。当捕获进程遇到对源表所做的 DDL 更改的此日志记录时,更改表中的此已捕获列的数据类型会进行相应更改。

如果需要修改源表中已捕获列的数据类型以减小该数据类型的大小,请执行以下步骤以确保可以成功修改更改表中的对应列。

  1. 在源表中,更新要修改的列中的值以适合所计划的数据类型大小。例如,如果将数据类型从 int 更改为 smallint,则应将值更新为适合 smallint 范围(-32,768 到 32,767)的大小。

  2. 在更改表中,对对应列执行相同的更新操作。

  3. 通过指定新数据类型来更改源表。该数据类型更改成功传播到更改表。

数据操作语言修改

对启用了变更数据捕获的源表执行插入、更新和删除操作时,这些 DML 操作的记录将显示在数据库事务日志中。变更数据捕获进程从事务日志中检索关于那些更改的信息,然后向更改表中添加一行或两行来记录更改。条目添加到更改表中的顺序与它们提交到源表的顺序是相同的,不过更改表条目的提交通常必须对一组更改执行,而不是对单个条目执行。

在更改表条目中,__$start_lsn 列用于记录与源表更改相关联的提交 LSN,__$seqval column 用于确定更改在其事务内的顺序。这些元数据列可共同用于确保保留源更改的提交顺序。因为捕获进程从事务日志获取其更改信息,所以必须注意更改表条目不会与其对应的源表更改同步显示。在捕获进程处理了事务日志中的相关更改条目后,对应的更改将异步显示。

对于插入和删除操作,会设置更新掩码中的所有位。对于更新操作,会修改更新(旧值)行和更新(新值)行中的更新掩码以指出在更新过程中有所更改的列。