SqlServer目前仅支持在2008及以上版本开启CDC(变更数据捕捉)功能。
CDC通过读取事务日志,记录DML操作的发生时间、操作类型以及受影响数据的变化,然后将这些数据记录到CDC自动创建的表中。可以通过CDC提供的存储过程来获取具体的变化明细。
可执行以下存储过程启用CDC:
// 先对数据库启用cdc
EXEC sys.sp_cdc_enable_db;
// 对表employee启用cdc
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'employee',
@capture_instance = NULL,
@supports_net_changes = 1,
@role_name = NULL;
执行成功后,CDC会自动创建用于跟踪数据库变更的若干辅助表。
cdc模式下自动创建的表一般命名为 dbo_TABLENAME_CT,比如表employee对应于自动创建的表为:dbo_employee_CT,该表记录了所有源于employee的变更事件。
另外,所有启用CDC的表,前面几个字段都是相同的,其余字段则与源表的列一一对应。公共的字段详细说明如下:
字段名 | 字段类型 | 说明 |
---|---|---|
__$start_lsn | binary(10) | 提交与更改相关联的LSN,以保存变更的提交顺序,并且在同一个事务中提交的变更都拥有相同的LSN值。 |
__$seqval | binary(10) | 在事务中对同一行的多个修改通过这个序列值来记录执行顺序。 |
__$operation | int | 用于标识DML操作的类型,在将变更应用于目标库时会使用该标识。1=delete,2=insert,3=update(捕获字段记录的是更新前的值)仅当指定了行过滤选项‘all update old’才会应用, 4=update(捕获字段记录的是更新后的值) |
__$update_mask | varbinary(128) | 位掩码,其位对应于为捕获实例标识的每个捕获列。当__$operation 为1或2时,所有位赋值为1,而当__$operation为3或4时,只有捕获列发生变更的对应位赋值为1。 |