开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

SQL Server审计功能入门:更改跟踪(Change Tracking)

简介: 原文:SQL Server审计功能入门:更改跟踪(Change Tracking) 介绍        更改跟踪是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制。常规的,自定义变更跟踪和读取跟踪数据,会使用触发器,存储过程和记录变更的用户表等, 还需要保证访问一致和相关清理工作。
+关注继续查看
原文:SQL Server审计功能入门:更改跟踪(Change Tracking)

介绍

       更改跟踪是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制。常规的,自定义变更跟踪和读取跟踪数据,会使用触发器,存储过程和记录变更的用户表等,

还需要保证访问一致和相关清理工作。 使用CT会减少额外工作量和保证访问一致性。

启用CT的表上必须得有主键,所有版本适用。为了保证更改信息的有效性,官方建议结合快照隔离使用。

CT只能提供:

                    哪些行/列发生了更改

                    被更改行的最新数据。

不能提供:更改发生的次数,中间值。

应用:离线缓存的更新,ETL更新

注意事项

                  1. 写入变更到变更记录表,所以执行计划会多一个操作符,增加开销。

                  2. 每个启用CT的表会创建一个内部更改表。

                  3. 对于用户表中每行的每个更改,都会向内部更改表中添加一行。  该行有一个较小的固定开销,外加一个大小等于主键列大小的可变开销。

                  4. 对于每个已提交的事务,都会向内部事务表中添加一行。

实现

1. 在库级别启用CT
       

alter database TestCT 

set change_tracking=on 

( 

  change_retention=2 days, 

  auto_cleanup=on 

)

2. 对要跟踪的对象启用CT
alter table sometable 

enable change_tracking 

go
3. 使用CHANGETABLE函数查看CT数据。SYS_CHANGE_VERSION是库中任何行的变改的最新版本号。

   返回行的最新更改数据:

SELECT t.* 

      , ct.* 

FROM dbo.SomeTable t 

CROSS APPLY CHANGETABLE(VERSION dbo.SomeTable, (ID), (t. ID)) AS ct;
   返回指定last_sync_versiion改变的数据:
DECLARE @version BIGINT = 2; 

SELECT t.* 

, ct.* 

FROM CHANGETABLE (CHANGES dbo.SomeTable, @version) AS ct 

      INNER JOIN dbo.SomeTable t ON t. ID = ct. ID 

Go

4. 对列启用CT

CREATE TABLE dbo.NewTable ( 

ID INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_NewTable PRIMARY KEY 

      , BigColumn VARCHAR(255) NOT NULL 

      , AnotherBigColumn VARCHAR(255) NOT NULL 

) 

GO 

ALTER TABLE NewTable 

ENABLE CHANGE_TRACKING 

WITH (TRACK_COLUMNS_UPDATED=ON)
5. 查询CT列的变更数据

    使用CHANGE_TRACKING_IS_COLUMN_IN_MASK结合CHANGETABLE

DECLARE @version BIGINT ; 

--get previous version 

SELECT @version= CHANGE_TRACKING_CURRENT_VERSION()-1; 

SELECT *, 

CHANGE_TRACKING_IS_COLUMN_IN_MASK( 

              COLUMNPROPERTY( OBJECT_ID('dbo.NewTable'),'BigColumn','COLUMNID'  

               ), 

         CT.SYS_CHANGE_COLUMNS 

              ) AS BigColumn_Changed, 

CHANGE_TRACKING_IS_COLUMN_IN_MASK( 

                                    COLUMNPROPERTY( 

                        OBJECT_ID('dbo.NewTable'), 

                        'AnotherBigColumn','COLUMNID' 

               ), 

         CT.SYS_CHANGE_COLUMNS 

              ) AS AnotherBigColumn_Changed 

FROM CHANGETABLE(CHANGES dbo.NewTable,@version) AS CT 

INNER JOIN dbo.NewTable NT 

ON CT.ID=NT.ID

总结

    1. 所谓轻量,是相对的。CT仍需要记录变更记录,需要额外的开销。

    2. CT只能记录最终值,所以实际应用中用得不多,只适用于特定场景。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
pg_ctl: server did not start in time
postgresql 启动超时异常,可怎么解决
29 0
APP的注册和登录功能设计
APP的注册和登录功能设计
30 0
Angular2组件库 - Modal组件实现详解(一)
       这篇文章其实写的有点晚了。去年6月份,Angular2的版本刚升级到rc-4,一切都还处于蛮荒时期(虽然现在依然不是太稳定...)。当时为我们的[组件库](http://zorro.alibaba.net/#/docs/angular/introduce)开发[Modal组件](http://zorro.aliba
14889 0
SQL Server 2012 新特性:新增和修改函数
转换函数      1.PARSE      Parse是把字符串类型转化为想要的类型,看看和convert和cast的区别         SELECT PARSE ('2.111111' AS float ),CAST ('2.
824 0
SQL Server审计功能入门:CDC(Change Data Capture)
原文:SQL Server审计功能入门:CDC(Change Data Capture) 介绍 SQL Server 2008引入了CDC(Change Data Capture),它能记录: 1. 哪些数据行发生了改变 2. 数据行变更的历史记录,而不仅仅是最终值。
1312 0
+关注
杰克.陈
一个安静的程序猿~
10424
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载