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

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

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

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

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

EXEC sys.sp_cdc_enable_db

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

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

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

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

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

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

还会添加一个函数

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

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

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

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

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

SELECT * FROM cdc.Orders_CT

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

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

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

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

很好理解,不是吗?

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

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

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

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

查询的结果如下:

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

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

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

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

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

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

–执行存储过程

EXEC GetOrdersCDCResult ‘2011-8-10′,’2011-8-11’

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

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

本文所有的代码如下:

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

以上就是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() 来自动产生行号

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/233572.html<

(0)
运维的头像运维
上一篇2025-04-20 16:50
下一篇 2025-04-20 16:51

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注