Audit是SQL Server 2008之後才有的功能,它能告訴你“誰什麼時候做了什麼事情”。具體是指稽核SQL Server 資料庫引擎執行個體或單獨的資料庫涉及到跟蹤和記錄資料庫引擎中發生的事件。它的底層是基于擴充事件(Extented Event),是以其性能和靈活性相對較好。稽核資料可以輸出到稽核檔案、Windows安全日志和應用程式日志。
Audit都需要建立一個執行個體級的“SQL Server稽核”,然後可以建立從屬于它“伺服器稽核規範”和“資料庫稽核規範”。可以了解“SQL Server稽核”是稽核的頂級容器,這兩個“規範”是定義要稽核的具體内容。
建立和使用稽核的一般過程:
1. 建立稽核并定義目标。
2. 建立映射到稽核的伺服器稽核規範或資料庫稽核規範,并啟用稽核規範。
3. 啟用稽核。
4. 通過使用 Windows“事件檢視器”、“日志檔案檢視器”或 fn_get_audit_file 函數來讀取稽核事件。
建立測試資料庫和資料:
1. 建立稽核和定義目标。
建立稽核可以用SSMS或者語句實作。所謂目标,就是稽核輸出存到哪裡,與擴充事件的Target差不多。

對應的語句建立:
簡單說明一下相關參數:
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和表結構修改操作都被稽核。
對應的語句:
對照SSMS,參數的意義就很明白了。更詳細内容參考:CREATE DATABASE AUDIT SPECIFICATION
稽核活動類型(Audit Action Type)參考:SQL Server 稽核操作組和操作
3. 啟用稽核
SQL Server在建立稽核和稽核規範時,預設是不啟用,需要顯式啟用。在前面兩步,我已經顯式啟用了。
4. 測試和檢視稽核資料
在前面目标定義的檔案中會生成一個稽核檔案,檔案名:[SQL Server稽核名稱]_[稽核的GUID]_*.sqlaudit。
這個檔案也可以用其它文字編輯器打,但是不便閱讀。通常使用系統函數sys.fn_get_audit_file讀取它。
從結果可以得到:誰在什麼時候做了什麼。Select和Alter語句隻有一條記錄。Update有兩條記錄,一條Select和一條Update。将audit_file_offset的值傳遞給fn_get_audit_file作為第三個參數值,可以實作從指定的offset讀取稽核檔案。注意:event_time輸出為UTC時間了。
當然也可以直接檢視:
5. 嘗試伺服器稽核規範
稽核建立和删除登入,并将稽核内容記錄到應用程式日志。
通過Windows的事件檢視器,可以檢視到33205事件。個人覺得在檢視資料詳細事件時,使用XML格式更好了解一些。
SQL Server稽核相對而言性能影響較少,稽核粒度也非常靈活。
稽核是針對“事件“,回答”誰什麼時候幹了什麼“,但對資料本身變化的跟蹤力度較弱。
稽核的目标結果,無論是稽核檔案或者應用程式日志,都需要另外處理和分析才能得想要的内容。