最近工作中有一個需求,就是某一個比較重要的業務表經常被莫名其妙的變更。在SQL Server中這類工作如果不事前捕獲記錄的話,無法做到。對于捕獲變更來說,可以考慮的選擇包括Trace,CDC。但Trace的成本比較大,對于負載量較高的系統并不合適,而CDC需要影響業務庫,因此SQL Server Audit就是一個比較好的選擇。
在SQL Server中,如果只是希望獲得表的更新時間,只需要看表的聚集索引的最后更新時間即可,代碼如下:
SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'DateBaseName')
AND OBJECT_ID=OBJECT_ID('TableName')
但這種方式并不能看到由某人在某個時間修改了某個表,在此使用Server Audit。Server Audit底層采用的是擴展事件,且存儲結構可以以單獨文件獨立于用戶庫,因此不僅性能較好,也不會對用戶庫產生影響。
下面是啟用審核的T-SQL代碼:
USE master
CREATE SERVER AUDIT audit1 TO FILE (FILEPATH='D:\SQLAudit')
USE AdventureWorks2012
CREATE DATABASE AUDIT SPECIFICATION SerialPic FOR SERVER AUDIT audit1
ADD(UPDATE,INSERT,DELETE ON Person.Address by dbo)
USE master
CREATE SERVER AUDIT audit1 TO FILE (FILEPATH='D:\SQLAudit')
USE AdventureWorks2012
CREATE DATABASE AUDIT SPECIFICATION SerialPic FOR SERVER AUDIT audit1
ADD(UPDATE,INSERT,DELETE ON Person.Address by dbo)
上述代碼首先創建服務器級別的審核,并存入D:\SQLAudit中,然后對應創建數據庫級別的審核。在數據庫級別的審核中,跟蹤Person.Address表的Update,Insert,Delete操作。
接下來嘗試修改數據庫Person.Address,在安全-審核下查看審核日志,如圖1所示。
圖1.查看審核日志
結果如圖2所示。
圖2.數據庫審核記錄
這樣就可以看到誰在什么時間曾經對該表做過哪些修改。當然除了UI方式,也可以通過T-SQL方式查看審核記錄。
SELECT * FROM
fn_get_audit_file('D:\SQLAudit\audit1_B8A7821A-D735-446D-B6FA-DF582AB80375_0_130648999540780000.sqlaudit', default, default)
文章列表