开启SQLServer代理。对数据库启用CDC数据库级别功能。
USE dbname
GO
EXEC sys . sp_cdc_enable_db
GO检查是否开启:
SELECT is_cdc_enabled ,
CASE WHEN is_cdc_enabled = 0 THEN 'CDC 功能禁用 '
ELSE 'CDC 功能启用 '
END 描述
FROM sys . databases
WHERE NAME = 'dbname'
对某些表开启捕获:
USE dbname; GO EXECUTE sys.sp_cdc_enable_table @source_schema = N'dbo' , @source_name = N'dept' , @role_name = N'cdc_Admin'--可以自动创建 , @capture_instance=DEFAULT GO
检查是否开启成功: SELECT name , is_tracked_by_cdc , CASE WHEN is_tracked_by_cdc = 0 THEN 'CDC功能禁用' ELSE 'CDC功能启用' END 描述 FROM sys.tables WHERE OBJECT_ID IN( OBJECT_ID('dbo.dept') )

可以对表insert数据,查看数据变化:
select * from [cdc].[dbo_dept_CT];
如果有数据的插入、更新、删除会在这里记录。
对于__$operation列:1 = 删除、2= 插入、3= 更新(旧值)、4= 更新(新值)对于__$start_lsn列:由于更改是来源与数据库的事务日志,所以这里会保存其事务日志的开始序列号(LSN)
但是微软不建议直接查询这类表,建议使用cdc.fn_cdc_get_all_changes_<捕获实例> 和cdc.fn_cdc_get_net_changes_<capture_instance> 来查询
查询已经开启的捕获: EXECUTE sys.sp_cdc_help_change_data_capture;GO
USE Sales; GO cdc.fn_cdc_get_all_changes_<捕获实例>用法: DECLARE @from_lsn binary(10), @to_lsn binary(10) SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_dept') SET @to_lsn = sys.fn_cdc_get_max_lsn() SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_dept (@from_lsn, @to_lsn, N'all'); GO
