在网上看到一篇关于监测表中的插入,更新,删除的方法,使用触发器实现的,很有价值。

地址:http://www.dbaunion.com/u/livecoach/Blog.aspx/t-19

有时候,我们在某一重要的时间段需要监控某张表的变化情况,包含插入、更新、删除。举例来说,当我们把数据导出到外部的系统时,我们希望导出的是全部的数据,而且最好是导出上次导出之后变动的数据。

作为DBA,我们可采传统的触发器操作,来构建一个元数据表或一个时间戳列来监控数据的变化。

代码如下:Code Listing 1

该代码在 SQL 2005(SP3), SQL 2008 R2 (RTM with cu5)测试通过

---------------------Method 1: TRIGGER---------------------Base Table DefinitionIF OBJECT_ID('CheckSumTest', 'U') IS NOT NULL DROP TABLE CheckSumTestGOCREATE TABLE CheckSumTest(        id                      int                     IDENTITY(1,1) NOT NULL PRIMARY KEY,        vc1                     varchar(1)      NOT NULL,        vc2                     varchar(1)      NOT NULL)GOINSERT dbo.CheckSumTest (vc1, vc2) SELECT 'a', 'b'INSERT dbo.CheckSumTest (vc1, vc2) SELECT 'b', 'a'GO--Create Audit Summary Table to hold Meta-DataIF OBJECT_ID('dbo.TableAuditSummary', 'U') IS NOT NULL DROP TABLE dbo.TableAuditSummaryCREATE TABLE dbo.TableAuditSummary(       id                      INT                     IDENTITY(1,1)   NOT NULL PRIMARY KEY,        TableName       sysname         NOT NULL,        LastUpdate      DATETIME        NOT NULL,        LastExport      DATETIME        NOT NULL)GOINSERT dbo.TableAuditSummary (TableName, LastUpdate, LastExport) VALUES ('dbo.CheckSumTest', GETDATE(), GETDATE())GO--Tables that need exportingSELECT * FROM dbo.TableAuditSummary WHERE LastUpdate>LastExport--Create Trigger on all Base Tables--This fires on any insert/update/delete and writes new LastUpdate column for the table set to Current Date and TimeIF OBJECT_ID('dbo.trg_CheckSumTest_MaintainAuditSummary', 'TR') IS NOT NULL DROP TRIGGER dbo.trg_CheckSumTest_MaintainAuditSummaryGOCREATE TRIGGER dbo.trg_CheckSumTest_MaintainAuditSummaryON dbo.CheckSumTestAFTER INSERT, UPDATE, DELETEASBEGINIF (object_id('dbo.CheckSumTest') IS NOT NULL)UPDATE dbo.TableAuditSummary SET LastUpdate=GETDATE() WHERE TableName='dbo.CheckSumTest'ENDGO--Make an UpdateUPDATE dbo.CheckSumTest SET vc1='b', vc2='a' WHERE id=1UPDATE dbo.CheckSumTest SET vc1='a', vc2='b' WHERE id=2--Check Meta-DataSELECT * FROM dbo.TableAuditSummary WHERE LastUpdate>LastExport--When we have Exported the data, we run the following to reset MetaDataUPDATE dbo.TableAuditSummary SET LastExport=GETDATE() WHERE LastUpdate>LastExport

最近我正在读关天SQLSERVER在线帮助(BOL)相关的知识, 我接触到了 SQL Server CHECKSUM(), BINARY_CHECKSUM(), and CHECKSUM_AGG() 这几个函数, 由此突然想到这些函数是不是也可以监控表的数据变化,而事实证明CHECKSUM_AGG() 函数尽管被描述为检测表的变化,但这里不适用.

使用 CheckSum() and CheckSum_Agg() 函数
CHECKSUM_AGG() 函数, 在Books OnLine 和许多相关的站点上是这样描述的, 通常用于检测一个表的数据是否更改. 这是一个代替触发器的更好的方法,只是该操作会引起表扫描的操作。于是我这次我仍然使用元数据来跟踪数据的变化,只是新建了列LastChkSum代替了LastUpdate,该列用于保存CHECKSUM_AGG(BINARY_CHECKSUM(*)),它将会在全表中产生一个唯一值,以区别数据的变化情况。

代码如下: Listing 2.

-----------------------------------------------Method 2 : using CheckSum (not reliable)-----------------------------------------------Base Table DefinitionIF OBJECT_ID('CheckSumTest', 'U') IS NOT NULL DROP TABLE CheckSumTestGOCREATE TABLE CheckSumTest( id int IDENTITY(1,1) NOT NULL PRIMARY KEY, vc1 varchar(1) NOT NULL, vc2 varchar(1) NOT NULL)GOINSERT dbo.CheckSumTest (vc1, vc2) SELECT 'a', 'b'INSERT dbo.CheckSumTest (vc1, vc2) SELECT 'b', 'a'GO--Create Audit Summary Table to hold Meta-DataIF OBJECT_ID('dbo.TableAuditSummary', 'U') IS NOT NULL DROP TABLE dbo.TableAuditSummaryCREATE TABLE dbo.TableAuditSummary( id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, TableName sysname NOT NULL, LastChkSum INT NOT NULL)GOINSERT dbo.TableAuditSummary (TableName, LastChkSum)SELECT 'dbo.CheckSumTest', CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM dbo.CheckSumTestGO--Tables that need exportingSELECT * FROM dbo.TableAuditSummary WHERE TableName='dbo.CheckSumTest'AND LastChkSum<>(SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM dbo.CheckSumTest)UNION ALL...--Make a Simple (Single row) UpdateUPDATE dbo.CheckSumTest SET vc1='c', vc2='a' WHERE id=1--Tables that need exportingSELECT * FROM dbo.TableAuditSummary WHERE TableName='dbo.CheckSumTest'AND LastChkSum<>(SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM dbo.CheckSumTest)UNION ALL...--Reset MetaDataUPDATE dbo.TableAuditSummary SET LastChkSum=(SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM dbo.CheckSumTest)WHERE TableName='dbo.CheckSumTest'--Make a Symmetric changeUPDATE dbo.CheckSumTest SET vc1='b', vc2='a' WHERE id=1UPDATE dbo.CheckSumTest SET vc1='c', vc2='a' WHERE id=2--Tables that need exporting (no rows returned as CHECKSUM_AGG() has not changed!!)SELECT * FROM dbo.TableAuditSummary WHERE TableName='dbo.CheckSumTest'AND LastChkSum<>(SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM dbo.CheckSumTest)UNION ALLCode Listing 2

正如你所看到的那样,对于单个的变化的情况,CHECKSUM是使用比较好的,但是CHECKSUM_AGG()却不能反应数据的变化

代码如下:Code Listing 3

--Base Table DefinitionIF OBJECT_ID('CheckSumTest', 'U') IS NOT NULL DROP TABLE CheckSumTestGOCREATE TABLE CheckSumTest( id int IDENTITY(1,1) NOT NULL PRIMARY KEY, vc1 varchar(1) NOT NULL, vc2 varchar(1) NOT NULL, chksum1 AS (CHECKSUM(id, vc1, vc2)), chksum2 AS (BINARY_CHECKSUM(id, vc1, vc2)))GOINSERT dbo.CheckSumTest (vc1, vc2) SELECT 'a', 'b'INSERT dbo.CheckSumTest (vc1, vc2) SELECT 'b', 'a'GO--Show Computed Columns and CheckSum_Agg() value = 199555SELECT * FROM CheckSumTest SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM CheckSumTest--Make a Simple (Single row) UpdateUPDATE dbo.CheckSumTest SET vc1='c', vc2='a' WHERE id=1--Show Computed Columns and CheckSum_Agg() value = 204816 (Ok)SELECT * FROM CheckSumTest SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM CheckSumTest--Make a Symmetric changeUPDATE dbo.CheckSumTest SET vc1='b', vc2='a' WHERE id=1UPDATE dbo.CheckSumTest SET vc1='c', vc2='a' WHERE id=2--Show Computed Columns and CheckSum_Agg() value = 204816 (Not Ok!)SELECT * FROM CheckSumTest SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM CheckSumTest

我们会发现调整前后 CHECKSUM_AGG(BINARY_CHECKSUM(*)) 的值是一样的,不能区分

结论:

CHECKSUM_AGG() 函数尽管被描述为能监测表数据的变化,在实际测试中是不行的。尤其是对表进行对称数据修改时,无法监测

SQL点滴24—监测表的变化(转载)相关推荐

  1. [转载] sql server 2000系统表解释

    sql server 2000系统表解释 汇总了几个比较有用的系统表,内容摘自联机帮助 sysobjects --------------- 在数据库内创建的每个对象(约束.默认值.日志.规则.存储过 ...

  2. SQL server 一张表随另一张表变化,建立触发器

    SQL server 一张表随另一张表变化,建立触发器 create trigger t_delf on files --建立删除触发器 instead of delete as begindecla ...

  3. SQL入门经典第5版(Sams Teach Yourself SQL in 24 Hours, 5th)随书习题的建表和插入

    Create Table & Insert Statements for<Sams Teach Yourself SQL in 24 Hours, Fifth Edition> e ...

  4. SQL Server 2008最直观的变化上(三)

    来谈谈SQL Server 2008最直观的变化.所谓最直观变化就是SQL Server 2008区别于SQL Server 2005在功能和界面方面的人为感知的变化. <?xml:namesp ...

  5. SQL点滴1—SET QUOTED_IDENTIFIER OFF语句的作用

    SQL点滴1-SET QUOTED_IDENTIFIER OFF语句的作用 原文:SQL点滴1-SET QUOTED_IDENTIFIER OFF语句的作用 先看下面几个sql语句 代码  1 SET ...

  6. SQL点滴26—常见T-SQL面试解析

    SQL点滴26-常见T-SQL面试解析 原文:SQL点滴26-常见T-SQL面试解析 它山之石可以攻玉,这一篇是读别人的博客后写下的,不是原原本本的转载,加入了自己的分析过程和演练.sql语句可以解决 ...

  7. SQL点滴19—T-SQL中的透视和逆透视

    原文:SQL点滴19-T-SQL中的透视和逆透视 透视 今天抽一点时间来看看透视和逆透视语句,简单的说就是行列转换.假设一个销售表中存放着产品号,产品折扣,产品价格三个列,每一种产品号可能有多种折扣, ...

  8. oracle维护常用SQL语句(查看系统表和视图)

    转:http://www.360doc.com/content/11/1230/15/7489308_176090474.shtml oracle维护常用SQL语句(查看系统表和视图) 1.查看表空间 ...

  9. SQL Server添加MDW性能监控报表(转载)

    SQL Server添加MDW性能监控报表(转载) 10.2 Data Collector与MDW Data Collection功能是SQL SERVER 2005版本提供的数据库监控报表的功能,通 ...

最新文章

  1. python小白逆袭大佬_飞桨深造学院百度深造7天打卡第6期:python小白反攻大神的经验,深度,学习,日,第六期,Python,小白逆袭,结营,心得...
  2. Java 复制List的值
  3. tia v15 添加项目_西门子S7-1500plc与S7-300plcPN/IO设备通信-创建项目
  4. Linux与Windows比较出的20个优势
  5. wireshark怎么抓包、wireshark抓包详细图文教程,简单介绍(及wireshark与wireshark legacy差别 )
  6. 3元购买微信小程序解决方案一个月
  7. 解读2022城市大脑首批三项标准
  8. 阿里云 服务网格 ASM
  9. java 音频 网络传输_如何流式传输音频?
  10. 【内网穿透笔记】FTP映射出现227 Entering Passive Mode错误命令原因及解决方法
  11. VSCode 新版 HTML文件 英文感叹号 + Tab 没有出现模板 解决方法
  12. java课设心得体会2000字_java课程设计报告心得体会
  13. check if DVE variable is valid
  14. 高等数学|一致连续性与连续性
  15. TPS和QPS的区别
  16. 比较员工的年龄大小(继承、异类集合、static)
  17. C语言编程题:分数的加减乘除
  18. 报错解决:PermissionError
  19. 反论文抄袭检查,吼吼,终于找到了
  20. html课堂笔记2.24

热门文章

  1. 信息化及信息化的五个层次
  2. python 登陆开心网图片批量下载-selenium实现
  3. [No000066]python各种类型转换-int,str,char,float,ord,hex,oct等
  4. (实用)Ubuntu 、CentOS更换国内源
  5. PHP基础封装简单的MysqliHelper类
  6. 解决toad中number类型小数位数过长按科学计数法显示的问题
  7. Oracle 11g 新特性 -- 只读表(read-only table)说明
  8. C#, ASP.NET面试题系列(1)
  9. Apache POI和EasyExcel 第六集:Apache POI的Excel读取单元格中的计算公式
  10. 由于应用universal link校验不通过_垃圾吊称重校验砝码2000kg市场行情分析