一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - SQL點滴24 監測表的變化

SQL點滴24 監測表的變化

2019-12-08 21:35Tyler Ning Sql Server

在網上看到一篇關于監測表中的插入,更新,刪除的方法,使用觸發器實現的,很有價值。

有時候,我們在某一重要的時間段需要監控某張表的變化情況,包含插入、更新、刪除。舉例來說,當我們把數據導出到外部的系統時,我們希望導出的是全部的數據,而且最好是導出上次導出之后變動的數據。 
作為DBA,我們可采傳統的觸發器操作,來構建一個元數據表或一個時間戳列來監控數據的變化。 
代碼如下:Code Listing 1 
該代碼在 SQL 2005(SP3), SQL 2008 R2 (RTM with cu5)測試通過 

復制代碼代碼如下:


------------------- 
--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,1) NOT NULL PRIMARY KEY, 
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 


最近我正在讀關天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 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,1) NOT NULL PRIMARY KEY, 
TableName sysname NOT NULL, 
LastChkSum INT NOT NULL 

GO 
INSERT dbo.TableAuditSummary (TableName, LastChkSum) 
SELECT 'dbo.CheckSumTest', CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM dbo.CheckSumTest 
GO 
--Tables that need exporting 
SELECT * FROM dbo.TableAuditSummary WHERE TableName='dbo.CheckSumTest' 
AND LastChkSum<>(SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM dbo.CheckSumTest) 
UNION ALL 
... 
--Make a Simple (Single row) Update 
UPDATE dbo.CheckSumTest SET vc1='c', vc2='a' WHERE id=1 
--Tables that need exporting 
SELECT * FROM dbo.TableAuditSummary WHERE TableName='dbo.CheckSumTest' 
AND LastChkSum<>(SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM dbo.CheckSumTest) 
UNION ALL 
... 
--Reset MetaData 
UPDATE dbo.TableAuditSummary SET LastChkSum=(SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM dbo.CheckSumTest) 
WHERE TableName='dbo.CheckSumTest' 
--Make a Symmetric change 
UPDATE dbo.CheckSumTest SET vc1='b', vc2='a' WHERE id=1 
UPDATE 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 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, 
chksum1 AS (CHECKSUM(id, vc1, vc2)), 
chksum2 AS (BINARY_CHECKSUM(id, vc1, vc2)) 

GO 
INSERT dbo.CheckSumTest (vc1, vc2) SELECT 'a', 'b' 
INSERT dbo.CheckSumTest (vc1, vc2) SELECT 'b', 'a' 
GO 
--Show Computed Columns and CheckSum_Agg() value = 199555 
SELECT * FROM CheckSumTest 
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM CheckSumTest 
--Make a Simple (Single row) Update 
UPDATE 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 change 
UPDATE dbo.CheckSumTest SET vc1='b', vc2='a' WHERE id=1 
UPDATE 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() 函數盡管被描述為能監測表數據的變化,在實際測試中是不行的。尤其是對表進行對稱數據修改時,無法監測 
作者:Tyler Ning

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 398av影院视频在线 | 猫咪社区免费资源在线观看 | 日韩一区视频在线 | 欧美se图| 日本精品欧洲www | 1769最新资源站 | 精品一区久久 | 国产免费午夜高清 | 欧美做受 | 丁香六月色婷婷综合网 | 欧美一级一级做性视频 | 久久亚洲午夜牛牛影视 | 办公室的秘密在线观看 | 久久se精品一区二区国产 | 日韩高清一区二区 | 久久99精品久久久久久园产越南 | 亚洲国产成人在线 | 国产一区国产二区国产三区 | 亚洲女同一区二区 | 国产激情久久久久影院小草 | 性bbwbbwbbwbbw撒尿 | 9l国产精品久久久久麻豆 | 午夜在线观看免费完整直播网 | 饭冈加奈子黑人解禁在线播放 | 亚洲网视频 | 亚洲国产五月综合网 | 啊好痛嗯轻一点免费 | 国产成人福利免费视频 | 日本一区二区视频在线 | www.99精品视频在线播放 | 成年人网站免费在线观看 | 国产成人精视频在线观看免费 | www.av网站| 日韩精品一区二区三区中文版 | 国产精品二区高清在线 | 精品久久久久久久久免费影院 | 国产女乱淫真高清免费视频 | 日本女人www | 日韩精选视频 | 好大好硬视频 | 91综合精品网站久久 |