SQL点滴24 监测表的变化
前端之家收集整理的这篇文章主要介绍了
SQL点滴24 监测表的变化,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有时候,我们在某一重要的时间段需要监控某张表的变化情况,包含插入、更新、删除。举例来说,当我们把数据导出到外部的系统时,我们希望导出的是全部的数据,而且最好是导出上次导出之后变动的数据。
作为DBA,我们可采传统的触发器操作,来构建一个元数据表或一个时间戳列来监控数据的变化。
代码如下:Code Listing 1
该代码在 sql 2005(SP3),sql 2008 R2 (RTM with cu5)测试通过
<div class="codetitle"><a style="CURSOR: pointer" data="87675" class="copybut" id="copybut87675" onclick="doCopy('code87675')"> 代码如下:
<div class="codebody" id="code87675">
-------------------
--Method 1: TRIGGER
-------------------
--Base Table Definition
IF OBJECT_ID('CheckSumTest','U') IS NOT NULL DROP TABLE CheckSumTest
GO
CREATE TABLE CheckSumTest
(
id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
vc1 varchar(1) NOT NULL,
vc2 varchar(1) NOT NULL
)
GO
INSERT dbo.CheckSumTest (vc1,vc2) SELECT 'a','b'
INSERT dbo.CheckSumTest (vc1,vc2) SELECT 'b','a'
GO
--Create Audit Summary Table to hold
Meta-Data
IF OBJECT_ID('dbo.TableAuditSummary','U') IS NOT NULL DROP TABLE dbo.TableAuditSummary
CREATE TABLE dbo.TableAuditSummary
( id INT IDENTITY(1,
TableName sysname NOT NULL,
LastUpdate DATETIME NOT NULL,
LastExport DATETIME NOT NULL
)
GO
INSERT dbo.TableAuditSummary (TableName,LastUpdate,LastExport) VALUES ('dbo.CheckSumTest',GETDATE(),GETDATE())
GO
--Tables that need exporting
SELECT
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 Time
IF OBJECT_ID('dbo.trg_CheckSumTest_MaintainAuditSummary','TR') IS NOT NULL DROP TRIGGER dbo.trg_CheckSumTest_MaintainAuditSummary
GO
CREATE TRIGGER dbo.trg_CheckSumTest_MaintainAuditSummary
ON dbo.CheckSumTest
AFTER INSERT,UPDATE,DELETE
AS
BEGIN
IF (object_id('dbo.CheckSumTest') IS NOT NULL)
UPDATE dbo.TableAuditSummary SET LastUpdate=GETDATE() WHERE TableName='dbo.CheckSumTest'
END
GO
--Make an Update
UPDATE dbo.CheckSumTest SET vc1='b',vc2='a' WHERE id=1
UPDATE dbo.CheckSumTest SET vc1='a',vc2='b' WHERE id=2
--Check Meta-Data
SELECT FROM dbo.TableAuditSummary WHERE LastUpdate>LastExport
--When we have Exported the data,we run the following to reset
MetaData
UPDATE dbo.TableAuditSummary SET LastExport=GETDATE() WHERE LastUpdate>LastExport
尽管被描述为检测表的变化,但这里不适用.
上是这样描述的,通常用于检测一个表的数据是否更改. 这是一个代替触发器的更好的
,只是该操作会引起表扫描的操作。于是我这次我仍然使用元数据来跟踪数据的变化,只是新建了列LastChkSum代替了LastUpdate,该列用于保存CHECKSUM_AGG(BINARY_CHECKSUM(