SQL Server 2008数据库中CDC的功能使用及说明

数据库 SQL Server
本文我们主要对SQL Server 2008数据库中CDC的功能使用进行了详细地说明与解释,希望能够对您有所帮助。

SQL Server 2008数据库中CDC的功能使用及说明的相关知识是本文我们主要要介绍的内容,那么什么是CDC呢?CDC(Change Data Capture:变更数据捕获)这个功能是SQL Server 2008企业版的功能,它提供了一种新的机制,对表格数据的更新进行跟踪,在数据仓库的建设过程中,通过这种技术,可以简化从业务数据库导入数据的复杂度。

1. 准备一个数据库,里面准备一个表,Orders

SQL Server 2008数据库中CDC的功能使用及说明

2. 启用数据库级别的CDC选项

--在数据库级别启用CDC功能

EXEC sys.sp_cdc_enable_db

这个命令执行完之后,会在系统表里面添加6个表格

SQL Server 2008数据库中CDC的功能使用及说明

3.在需要做数据捕获的表上面启用CDC选项

EXEC sys.sp_cdc_enable_table @source_schema='dbo',@source_name='Orders',@capture_instance='Orders',@supports_net_changes=0,@role_name=null 
http://msdn.microsoft.com/en-us/library/bb522475.aspx 
  • 1.
  • 2.

执行之后,会有如下的输出消息

SQL Server 2008数据库中CDC的功能使用及说明

这个提示的意思是说,要启动SQL Server Agent。因为CDC功能是要通过一个两个作业来自动化完成的

SQL Server 2008数据库中CDC的功能使用及说明

与此同时,执行上面的命令还将在系统表中添加一个表格

SQL Server 2008数据库中CDC的功能使用及说明

还会添加一个函数

SQL Server 2008数据库中CDC的功能使用及说明

4.插入或者更新数据测试CDC功能

--插入或者更新数据测试CDC功能

INSERT Orders(CustomerID) VALUES('Microsoft');  
INSERT Orders(CustomerID) VALUES('Google');  
UPDATE Orders SET CustomerID='Yahoo' WHERE OrderID=1 
DELETE FROM Orders WHERE OrderID=2 
  • 1.
  • 2.
  • 3.
  • 4.

这个范例插入两行数据,紧接着又对第一行更新,然后还删除了第二行,所以最终只有一行数据

SQL Server 2008数据库中CDC的功能使用及说明

那么,我们来看看CDC做了什么事情呢?

SELECT * FROM cdc.Orders_CT

SQL Server 2008数据库中CDC的功能使用及说明

我们可以来解释一下上面结果的含义:

__$operation=2的情况,表示新增

__$operation=3或者4,表示更新,3表示旧值,4表示新值

__$operation=1的情况,表示删除

很好理解,不是吗?

但是,我们一般都是需要按照时间范围进行检索,对吧,所以,需要使用下面的语法进行查询

--按照时间范围查询CDC结果

DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)  
DECLARE @start_time DATETIME = '2011-8-10 00:00:00' 
DECLARE @end_time DATETIME ='2011-8-11 00:00:00' 
SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)  
SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)  
SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all') 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

关于sys.fn_cdc_map_time_to_lsn这个函数,请参考http://msdn.microsoft.com/en-us/library/bb500137.aspx

查询的结果如下:

SQL Server 2008数据库中CDC的功能使用及说明

如果需要包含更新操作的旧值,则可以以下的语法

DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)  
DECLARE @start_time DATETIME = '2011-8-10 00:00:00' 
DECLARE @end_time DATETIME ='2011-8-11 00:00:00' 
SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)  
SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)  
SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all update old') 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

SQL Server 2008数据库中CDC的功能使用及说明

通常,为了方便起见,我们会将这个查询定义为一个存储过程,如下

--定义存储过程来进行查询

CREATE PROC GetOrdersCDCResult(@start_time DATETIME,@end_time DATETIME)  
AS  
BEGIN  
DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)  
SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)  
SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)  
SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all')  
END 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

然后,每次需要用的时候,就直接调用即可。

--执行存储过程

EXEC GetOrdersCDCResult '2011-8-10','2011-8-11'

5.结合SSIS实现事实表的增量更新

下面展示了一个SSIS 包的设计,这里面读取CDC的数据,先进行一些查找,然后按照__$operation的值拆分成为三个操作,分别进行插入,更新和删除,这样就可以实现对事实表的增量更新

SQL Server 2008数据库中CDC的功能使用及说明

本文所有的代码如下:

USE SampleDatabase  
GO  
--在数据库级别启用CDC功能  
EXEC sys.sp_cdc_enable_db   
--在需要做数据捕获的表格上面启用CDC功能  
EXEC sys.sp_cdc_enable_table @source_schema='dbo',@source_name='Orders',@capture_instance='Orders',@supports_net_changes=0,@role_name=null 
--插入或者更新数据测试CDC功能  
INSERT Orders(CustomerID) VALUES('Microsoft');  
INSERT Orders(CustomerID) VALUES('Google');  
UPDATE Orders SET CustomerID='Yahoo' WHERE OrderID=1 
DELETE FROM Orders WHERE OrderID=2 
--查询CDC的结果  
SELECT * FROM cdc.Orders_CT  
--按照时间范围查询CDC结果  
DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)  
DECLARE @start_time DATETIME = '2011-8-10 00:00:00' 
DECLARE @end_time DATETIME ='2011-8-11 00:00:00' 
SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)  
SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)  
SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all')  
--定义存储过程来进行查询  
CREATE PROC GetOrdersCDCResult(@start_time DATETIME,@end_time DATETIME)  
AS  
BEGIN  
DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)  
SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)  
SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)  
SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all')  
END  
--执行存储过程  
EXEC GetOrdersCDCResult '2011-8-10','2011-8-11' 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

以上就是SQL Server 2008数据库中CDC的功能使用及说明的全部内容,本文我们就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. SQL Server数据库链接查询的方式详解
  2. SQL Server 2005导入Oracle 10g的C#源码
  3. SQL Server数据库没有JOIN条件导致笛卡尔乘积
  4. SQL Server 2008中使用FileStream存取大文件实例介绍
  5. SQL Server数据库row_number() over() 来自动产生行号
责任编辑:赵鹏 来源: 博客园
相关推荐

2010-07-13 14:31:09

SQL Server

2010-12-17 09:11:41

SQL Server

2009-03-19 09:30:59

2011-08-11 14:23:57

SQL Server 索引分区

2010-07-06 14:00:51

SQL Server

2011-07-25 12:56:44

SSMAOracle数据库SQL Server

2011-08-09 17:24:21

SQL Server 数据库日志

2011-08-18 10:21:50

SQL ServerDATEPART

2011-03-29 13:56:12

SQL Server 数据压缩

2011-08-16 18:11:13

SQL Server 手动提交

2011-08-25 13:41:50

SQL Server 变更跟踪

2010-08-27 09:59:51

SQL Server

2011-03-29 13:33:26

2011-03-28 16:39:41

SQL Server

2011-08-18 10:55:55

SQL ServerDATEADD

2011-08-15 14:12:16

SQL ServerDATEDIFF

2011-09-07 15:11:31

SQL Server同步

2011-09-01 18:38:02

SQL Server 文件流功能

2009-04-10 15:37:48

SQL Server2镜像实施

2010-07-06 15:02:12

SQL Server
点赞
收藏

51CTO技术栈公众号