介紹
Audit是SQL Server 2008之後纔有的功能,它能告訴你“誰什麼時候做了什麼事情”。具體是指審覈SQL Server 數據庫引擎實例或單獨的數據庫涉及到跟蹤和記錄數據庫引擎中發生的事件。它的底層是基於擴展事件(Extented Event),所以其性能和靈活性相對較好。審覈數據可以輸出到審覈文件、Windows安全日誌和應用程序日誌。
Audit都需要創建一個實例級的“SQL Server審覈”,然後可以創建從屬於它“服務器審覈規範”和“數據庫審覈規範”。可以理解“SQL Server審覈”是審覈的頂級容器,這兩個“規範”是定義要審覈的具體內容。
創建和使用審覈的一般過程:
1. 創建審覈並定義目標。
2. 創建映射到審覈的服務器審覈規範或數據庫審覈規範,並啓用審覈規範。
3. 啓用審覈。
4. 通過使用 Windows“事件查看器”、“日誌文件查看器”或 fn_get_audit_file 函數來讀取審覈事件。
實現
創建測試數據庫和數據:
use master go create database AuditTest go use AuditTest go create table tb(ID int primary key ,name varchar(20),weight decimal(10,2)); insert into tb values(1,'John',70.2),(2,'Ted',80.8),(3,'Clark',75.1) go
1. 創建審覈和定義目標。
創建審覈可以用SSMS或者語句實現。所謂目標,就是審覈輸出存到哪裏,與擴展事件的Target差不多。
對應的語句創建:
--create Server AuditUSE [master]GOCREATE SERVER AUDIT [Audit-AuditTest]TO FILE( FILEPATH = N'D:\share' ,MAXSIZE = 50 MB ,MAX_FILES = 10 ,RESERVE_DISK_SPACE = ON)WITH( QUEUE_DELAY = 1000 ,ON_FAILURE = CONTINUE --AUDIT_GUID=uniqueidentifier )--WHERE object_name='tb'GO--Enable Server Auditalter server audit [Audit-AuditTest] with (state=on)
簡單說明一下相關參數:
TO FILE:指定輸出到審覈文件,也可以指定爲Security Log和Application Log。
FILEPATH:審覈文件的目錄地址。
MaxSize:單個審覈文件的最大容量。
MAXSIZE:類似於Trace,指定Rollover允許最多文件數。
RESERVE_DISK_SPACE:預先分配審覈文件到MaxSize。個人推薦啓用。
QUEUE_DELAY:指定事件發生到被強制審覈的毫秒間隔。指定爲0則爲同步審覈。
ON_FAILURE :當審覈向上檔寫入數據失敗時,接下來會採取的行爲:CONTINUE | SHUTDOWN | FAIL_OPERATION。
AUDIT_GUID:用於數據庫鏡像。類似Login的SID作用,鏡像會話的主庫如果有審覈,則在鏡像庫創建對應的審覈需要指定同樣GUID。
WHERE:相當於擴展事件中Predicate,用於指定過濾條件。
2. 創建數據庫審覈規範並啓用之
指定從屬於哪個SQL Server審覈和定義出要審覈的內容。可以通過SSM或者語句創建之。下面針對測試表tb創建審覈規範:任何人對tb表的DML和表結構修改操作都被審覈。
對應的語句:
--Create and enable Database Audit Specification USE [AuditTest] GO CREATE DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-AuditTest] FOR SERVER AUDIT [Audit-AuditTest] ADD (SCHEMA_OBJECT_CHANGE_GROUP), ADD (SELECT,DELETE,INSERT,UPDATE ON OBJECT::[dbo].[tb] BY [public]) WITH (STATE=ON) GO
對照SSMS,參數的意義就很明白了。更詳細內容參考:CREATE DATABASE AUDIT SPECIFICATION
審覈活動類型(Audit Action Type)參考:SQL Server 審覈操作組和操作
3. 啓用審覈
SQL Server在創建審覈和審覈規範時,默認是不啓用,需要顯式啓用。在前面兩步,我已經顯式啓用了。
4. 測試和查看審覈數據
use AuditTest go select * from dbo.tbwhere ID=1; update dbo.tbset name='Ted_New'where ID=2; alter table dbo.tb alter column name varchar(30); alter table dbo.tb add newCol varchar(20); go
在前面目標定義的文件中會生成一個審覈文件,文件名:[SQL Server審覈名稱]_[審覈的GUID]_*.sqlaudit。
這個文件也可以用其它文字編輯器打,但是不便閱讀。通常使用系統函數sys.fn_get_audit_file讀取它。
SELECT event_time , action_id , succeeded , session_id , session_server_principal_name , object_name, statement , file_name, audit_file_offsetfrom sys.fn_get_audit_file('d:\share\*',default,default)
從結果可以得到:誰在什麼時候做了什麼。Select和Alter語句只有一條記錄。Update有兩條記錄,一條Select和一條Update。將audit_file_offset的值傳遞給fn_get_audit_file作爲第三個參數值,可以實現從指定的offset讀取審覈文件。注意:event_time輸出爲UTC時間了。
當然也可以直接查看:
5. 嘗試服務器審覈規範
審覈創建和刪除登錄,並將審覈內容記錄到應用程序日誌。
USE [master] GO CREATE SERVER AUDIT [Audit-AuditTest]TO APPLICATION_LOG WITH( QUEUE_DELAY = 1000,ON_FAILURE = CONTINUE) GO Alter SERVER AUDIT [Audit-AuditTest] With(State=On) go Create Server Audit Specification SAS_CreateDropLogin For Server Audit [Audit-AuditTest] Add (SERVER_PRINCIPAL_CHANGE_GROUP) With (State=On) go create login xx with password='P@ssW0rd'; drop login xx ;
通過Windows的事件查看器,可以查看到33205事件。個人覺得在查看數據詳細事件時,使用XML格式更好理解一些。
總結
SQL Server審覈相對而言性能影響較少,審覈粒度也非常靈活。
審覈是針對“事件“,回答”誰什麼時候幹了什麼“,但對數據本身變化的跟蹤力度較弱。
審覈的目標結果,無論是審覈文件或者應用程序日誌,都需要另外處理和分析才能得想要的內容。