首页 追踪记录每笔业_务操作数据改变的利器_SqlCDC

追踪记录每笔业_务操作数据改变的利器_SqlCDC

举报
开通vip

追踪记录每笔业_务操作数据改变的利器_SqlCDC追踪记录每笔业 务操作数据改变的利器——SQLCDC 对于大部分企业应用来用,有一个基本的功能必不可少,那就是Audit Trail或 者Audit Log,中文翻译为追踪检查、审核检查或者审核记录。我们采用Audit Trail记录每一笔业务操作的基本信息,比如操作的基本描述、操作时间、操作者等。对于一些安全级别比较高的应用,或者操作一些比较敏感的数据,我们甚 至需要记录该笔业务操作引起的数据的改变。具体来说,这里的“数据改变”指的是每一条影响的记录在操作执行前后的变化。对于添加的记录,需要记录下新插入 的记录...

追踪记录每笔业_务操作数据改变的利器_SqlCDC
追踪记录每笔业 务操作数据改变的利器——SQLCDC 对于大部分企业应用来用,有一个基本的功能必不可少,那就是Audit Trail或 者Audit Log,中文翻译为追踪检查、审核检查或者审核记录。我们采用Audit Trail记录每一笔业务操作的基本信息,比如操作的基本描述、操作时间、操作者等。对于一些安全级别比较高的应用,或者操作一些比较敏感的数据,我们甚 至需要记录该笔业务操作引起的数据的改变。具体来说,这里的“数据改变”指的是每一条影响的记录在操作执行前后的变化。对于添加的记录,需要记录下新插入 的记录;对于删除的记录,需要记录下原来的记录;对于更新的记录,则需要同时记录下更新前后的记录。 说到这里,很多人都会想到采用触发器的方式来实现对数据改变的捕捉。但是这种实现方案具有一个最大的局限:由于触发器是在数据操作所 在事务范围内执行的,所有会带来性能的问题,严重的话还会因为触发器的执行导致事务超市。所 以在这里,我们介绍一种更好的解决方案:SQLCDC。 目录 一、SQLCDC简介 二、在数据库级别开启CDC 三、为某个数据表开 启CDC 四、记录添加记录的数据改变 五、记录删除数据的数据改变 六、记录更新记录的 数据改变 一、SQLCDC简介 CDC的全名为Change Data Capture,顾名思义,就是用于追踪和捕捉数据改变。CDC是在SQL Server 2008中才出现的新特性,而这个特性则在很早之前就出现在了Oracle中。对于SQL Server之前版本来说,在没有CDC的情况下,如果需要记录基于某个数据表的数据改变,我们只能采用触 发器,具体来说就是通过手工创建After Insert、After Update和After Delete触发器去记录变化的数据。而CDC给了我们一种更为方便、易用和省心的方式去记录某个数据表的历史操作。 二、在数据库级别开启CDC 在默认的情况下,数据库的CDC特性是被关闭的,你可以通过系统表sys.databases的is_cdc_enabled字段确定某个数据库的CDC是否开启。如果在默认的情况下,我执行如下的 SQL语句查看数据库TestDb的CDC是否开启,你将会看到该字段的值为0。 你可以通过执行系统存储过程 sys.sp_cdc_enable_db为当前数据库开启CDC特性。下面的T-SQL代码片断中,我们通过执行该存储过程为TestDb打开了CDC 特性。 Use TestDb Go Exec sys.sp_cdc_enable_db Go 三、为某个数据表开启CDC 由于CDC用于记录基于某个数据表的数据改变,所以在当前数据库CDC开启的情况下,你还需要显式地为某个数据表开启CDC特性。作为演示,我们通 过如下T-SQL在TestDb下创建了一个简单的Users表,它仅仅具有三个字段:Id、Name和Birthday。 CREATE TABLE [dbo].[Users]( [Id] [varchar](50) PRIMARY KEY, [Name] [nvarchar](50) NOT NULL, [Birthday] [date] NOT NULL) 数据表的CDC特性的开启通过执行sys.sp_cdc_enable_table存 储过程实现。调用该存储过程的最简的方式就是指定数据表的Schema、名称和用于提取改变数据必须具有的权限(角色)。我通过执行下面的T-SQL将我 们创建的Users表的CDC特性打开,其中@role_name参数被设置成NULL,表明我不对读取改变数据操作进行授权。 sys.sp_cdc_enable_table具有很多参数,至于相应参数所影响的CDC行为,可以参考SQL Server 2008在线文档。 Use TestDb Go Exec sys.sp_cdc_enable_table 'dbo', 'Users', @role_name = NULL Go 需要注意的是,CDC实际上建立在SQL Server Agent之上的,所以在执 行上述T-SQL之前需要启动SQL Server Agent。当某个数据表的CDC特性被开启之后,系统会为创建一个用于保存数据变化的追踪表(Tracking Table)。该表的Schema为cdc,命名方式为被追踪表的表名后加“CT”后缀。执行上面一段T-SQL之后,会有如下一个系统表被创建出来,我 们发现Users表的三个字段也在该表中。此外。该表还具有5个额外字段:__$start_lsn、__$end_lsn、__$seqval、 __$operation 和__$update_mask,表示日志系列号(Log Sequence Number)、操作(删除、插入、修改前和修改后)信息。 四、记录添加记录的数据改变 现在我们就可以来试验CDC针对某个数据表的数据改变的捕捉功能了,我们先来试试记录的添加操作。为此,我们执行如下一段T-SQL,插入两笔 User记录。 Insert Into Users(Id, Name, Birthday) Values ('001','Foo','1981-08-24') Insert Into Users(Id, Name, Birthday) Values ('002','Bar','1981-08-24') 然后通过如下的T-SQL查看cdc.dbo_Users_CT表的数据是否将添加操作涉及到的数据改变保存起来。从查询结果我们清晰地看到,上面 添加的两笔记录已经被记录下来,而__$operation字段为2表示的是“插入”操作。 五、记录更新数据的数据改变 接下来我们来CDC对更新操作的追踪记录,为此我们通过下面的T-SQL改变了用户Foo的Birthday。 Update Users Set Birthday = '1982-7-10' Where Name = 'Foo' 再次执行对于cdc.dbo_Users_CT的全表查询,你会看到这次多了两笔记录。其中第3条记录的是修改之前的数据,而第四条则是修改之后的数 据,它们的__$operation字段德值分别为3和4。 在这里值得一提的是__$update_mask字段的值,它表示的记录更新操作改变的字段。 这是一个以16进制表示的数字,在进行对修改字段进行判断的时候需要将其转换成2进制。上述的更新操作对应的__$update_mask值为0x04, 转化成2进制就是100,这三位分别代表3个字段。不过这里的顺序是从右到左,所以100这三位表示的字段为Birthday、Name和Id。1表示改变,0则表示保持不 变。由于在上面的T-SQL中,我们只改动了Birthday,这个和100这个值是吻合的。 六、记录删除记录的数据改变 我们最后来演示当我们对记录实施删除操作的时候,CDC会为我们记录下怎样的数据。现在我们执行如下的T-SQL将Users表中所有的记录均删 除。 Delete From Users 查看cdc.dbo_Users_CT的记录,多出的两笔记录正式我们删除的User记录,__$operation字段的值为1表示“删除”操作。 本篇文章仅仅是简单介绍SQLCDC的基本原理和大体上的使用方式,这篇文章《Introduction to Change Data Capture (CDC) in SQL Server 2008[转]》会给你更加详尽的介绍。如果你想深 入研究SQLCDC,还是参考SQL Server 2008在线文档。
本文档为【追踪记录每笔业_务操作数据改变的利器_SqlCDC】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_589748
暂无简介~
格式:doc
大小:24KB
软件:Word
页数:0
分类:互联网
上传时间:2020-03-08
浏览量:4