博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

sql server 2008新特性之一CDC(Change date capture)

Posted on 2011-08-24 15:50  leo.qian  阅读(448)  评论(0)    收藏  举报

--查看有多少DB启用了CDC
select name,is_cdc_enabled from sys.databases

--启用该DB的CDC
EXECUTE sys.sp_cdc_enable_db;


--启用该DB中某一个表的CDC
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'User',
@role_name     = null
GO

declare @from_lsn binary(10)
declare @to_lsn binary(10)
--获取与捕获的表相关的最小的LSN
select @from_lsn= sys.fn_cdc_get_min_lsn ('dbo_User')
--获取与捕获的表相关的最大的LSN
select @to_lsn= sys.fn_cdc_get_max_lsn()
--    Delete Statement = 1
--    Insert Statement = 2
--    Value before Update Statement = 3
--    Value after Update Statement = 4
--在指定间隔中发生的所有更改
--select * from cdc.fn_cdc_get_all_changes_dbo_User (@from_lsn,@to_lsn ,N'All')
--在指定间隔中发生的所有更改(包含Operation为3的,即包含Update之前的值)
--select * from cdc.fn_cdc_get_all_changes_dbo_User (@from_lsn,@to_lsn ,N'all update old')
--在指定间隔中发生的所有更改的最终内容(一条数据的所有操作,只返回最后的一条记录)
    --如果row_filter_option为all或者all with mask,__$operation可能为1,2,4
    --如果为all with merge _$operation可能为1,5
--SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_User(@from_lsn, @to_lsn, 'all')
--SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_User(@from_lsn, @to_lsn, 'all with mask')
--通过上一次请求的时间节点对应的lsn,返回下一次查询的下限时间点
select  sys.fn_cdc_increment_lsn (@from_lsn)
--与某一指定时间点比较,获取符合筛选条件的sln,作为获取数据记录的区间参数
    --largest less than 取小于当前时间的最大的sln
    --largest less than or equal 取小于或者等于当前时间的最大sln
    --smallest greater than 取大于当前时间的最小sln
    --smallest greater than or equal 取大于或者等于当前时间的最小sln
select sys.fn_cdc_map_time_to_lsn ('smallest greater than or equal', '2011-08-23 15:20:00.000');

--为所有变更数据捕获查询函数创建包装函数的脚本,执行该script后,将会创建对应的function,参数由from_sln,to_sln
--更改为start_time和 end_time
DECLARE @wrapper_functions TABLE (
    function_name sysname,
    create_script nvarchar(max));

INSERT INTO @wrapper_functions
EXEC sys.sp_cdc_generate_wrapper_function;

DECLARE @create_script nvarchar(max);
DECLARE #hfunctions CURSOR LOCAL fast_forward
FOR
    SELECT create_script FROM @wrapper_functions;

OPEN #hfunctions;
FETCH #hfunctions INTO @create_script;
WHILE (@@fetch_status <> -1)
BEGIN
    EXEC sp_executesql @create_script
    FETCH #hfunctions INTO @create_script
END;

CLOSE #hfunctions;
DEALLOCATE #hfunctions;



CDC通过对事务日志的异步读取,记录DML操作的发生时间、类型和实际影响的数据变化,然后将这些数据记录到启用CDC时自动创建的表中。通过cdc相关的存储过程,可以获取详细的数据变化情况。由于数据变化是异步读取的,因此对整体性能的影响不大,远小于通过Trigger实现的数据变化记录。

不同于Change Data Capture,Change Tracking仅记录DML操作的发生时间、类型和影响到的字段,不包含具体的变化数值

Change Tracking记录的数据比Change Data Capture少,对服务器性能的影响也小。