ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

今天简单说一下cdc 的使用

2019-12-06 18:00:30  阅读:391  来源: 互联网

标签:__ AAA2 cdc Col2 Col1 今天 简单 ID


从08开始,sql server 提供了一种叫做 变更数据捕获 cdc(Change Data Capture) 的功能,可以通过启用这个功能,来实现查看数据库中的表对象的数据的变化情况。(我感觉就是有点像sql server 自己提供的用户能直接看懂的数据变化功能)。

根据官方的说法。使用cdc 功能有以下好处

1、这是数据库自带的功能,无需额外的开发成本。

2、不需要改动表的结构,不需要动用到触发器,存储过程等手段去记录

3、性能开销最小化。(这个我也没有证实过╮(╯_╰)╭)

动用cdc 其实很简单

1、将数据库显示开启cdc 跟踪

  1. EXEC sys.sp_cdc_enable_db

2、然后我创建一个表,并对其开启cdc。这里列出的是最简单的参数,跟踪还可以设置到具体捕获哪些列产生变化的。具体参照

sys.sp_cdc_enable_table : https://msdn.microsoft.com/zh-cn/library/bb522475(v=sql.120).aspx

 
  1. CREATE TABLE AAA2
  2. (
  3. ID INT PRIMARY KEY,
  4. Col1 ),
  5. Col2 INT
  6. )
  7.  
  8. EXEC sys.sp_cdc_enable_table @source_schema = 'dbo',
  9. @source_name = 'AAA2'

3、启动代理服务器。(不启动也可以使跟踪创建成功,但是就不工作而已)

4、然后我们能在系统表里面看到多了一个cdc 的架构然后框住的那个就是开启了AAA2的跟踪了。

5、然后就可以往AAA2 里面搞些操作,看下是否有效了~

  1. INSERT INTO dbo.AAA2
  2. ( ID, Col1,Col2 )
  3. , ),( , ),( , )
  4.  
  5. UPDATE dbo.AAA2 SET Col1 = 'dd'
  6.  
  7. SELECT * FROM cdc.dbo_AAA2_CT
  8.  
  9. __$start_lsn __$end_lsn __$seqval __$operation __$update_mask ID Col1 Col2
  10. ---------------------- ------------- ---------------------- ------------ -------------------- ---- ------ -----------
  11. pp
  12. bb
  13. cc
  14. cc
  15. dd
  16. bb

有一个东东,启用的cdc ,意味着不能用truncate 了~会提示不能使用的哟~,至于查出来的结果基本都看懂吧?

有几个说明一下,

  1. __$operation : 1 删除 2 新增 3 修改(修改前的值) 4 修改(修改后的值)
  1. __$update_mask : 表示那个列做了操作,02 就是0010 表示第二列 ,那07就是 0111 表示123列都做了修改罗~就酱~

6 看到这里都还是觉得这个功能好好是不是啊~但是我觉得还是有一点不方便的。比方说当你需要修改表结构的时候~

栗子1 ,删除了一列Col2 然后再插入2条数据,然后还是会存在Col2的列(因为不需要改结构嘛╮(╯_╰)╭),然后跟踪的时候把值设置成空

  1. ALTER TABLE dbo.AAA2 DROP COLUMN Col2
  2.  
  3. INSERT INTO dbo.AAA2
  4. ( ID, Col1 )
  5. , N, N'EE')
  6.  
  7. __$start_lsn __$seqval __$operation __$update_mask ID Col1 Col2
  8. DD NULL
  9. EE NULL

栗子2 ,然后我脑抽的重新把Col2 加进去~然而我改成了字符串类型,然后从新插入数据 ,Col2 没值啊!!!那也正常,因为这是就结构,虽然名字一样,但是ColumnID已经不一样了啊!所以追踪不到是很正常的。

  1. )
  2.  
  3. INSERT INTO dbo.AAA2
  4. ( ID, Col1, Col2 )
  5. , -- ID - int
  6. N'jj', -- Col1 - nvarchar(50)
  7. 'jjj' -- Col2 - int
  8. )
  9.  
  10. __$start_lsn __$seqval __$operation __$update_mask ID Col1 Col2
  11. DD NULL
  12. EE NULL
  13. jj NULL

栗子3 ,那我更新总可以了吧!当更新的是元结构有的列,是可以更新成功的,但是如果是新列做了改动,则捕获不了,正常嘛(想想既然可以给你配置可跟踪的列,那么不存在这个列表里面的列发生变化不捕捉,就是这个道理罗~)

  1.  
  2. __$start_lsn __$seqval __$operation __$update_mask ID Col1 Col2
  3. III NULL

那该如何处理这个问题呢~

从心做一个捕获实例~从心做一个捕获实例~从心做一个捕获实例 重要的事情说3便 ╮(╯_╰)╭。也只有这样罗

综上所述,cdc 我就描述到这里~有什么发现的话我会补充哒~

标签:__,AAA2,cdc,Col2,Col1,今天,简单,ID
来源: https://www.cnblogs.com/tiancai/p/11996801.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有