SQL Server Audit監控觸發器狀態
一.本文所涉及的內容(Contents)
二.背景(Contexts)
DML觸發器一般會運用在業務系統的邏輯處理上,在你對資料庫使用者許可權控制不當的時候,這些DML觸發器很可能莫名的被禁用或者刪除了,你作為資料庫管理員你想做冤大頭嘛?背黑鍋嘛?如果不想,下面給出4種解決方案:
1. 使用DDL觸發器對服務級別或者資料庫級別進行監控,可以參考文件:SQL Server DDL觸發器運用,效果如下圖所示:
(Figure1:觸發器的日誌)
4. 第四種方案就是這篇文章要講到的新特性:SQL Server Audit,可以使用DATABASE AUDIT SPECIFICATION來捕獲這些事件。
三.實現程式碼(SQL Codes)
(一) 建立伺服器級別的稽核,注意設定FILEPATH為對應的路徑,顯示設定稽核狀態,建立稽核的時候只能是伺服器的;
USE master GO --建立伺服器級別稽核 CREATE SERVER AUDIT ServerAudit TO FILE (FILEPATH = 'F:\AuditLog\', MAXSIZE = 256 MB) WITH (ON_FAILURE = CONTINUE); GO --開啟稽核 ALTER SERVER AUDIT ServerAudit WITH (STATE = ON);
(二) 建立伺服器級別的稽核規範,這裡指定相對應的AUDIT(稽核)接收、儲存跟蹤和記錄的資料,可以同時多個稽核規範指向同一個稽核。
SCHEMA_OBJECT_CHANGE_GROUP,針對架構執行 CREATE、ALTER 或 DROP 操作時將引發此事件。任何資料庫的任何架構發生更改時,均將引發此事件。稽核操作組的其它值可以參考:SQL Server 稽核操作組和操作
--建立伺服器級別稽核規範 USE master GO CREATE SERVER AUDIT SPECIFICATION Schema_Change FOR SERVER AUDIT ServerAudit ADD (SCHEMA_OBJECT_CHANGE_GROUP) WITH (STATE = ON); GO
(三) 手動產生物件更改事件
--測試 CREATE TABLE dbo.TestAudit(Id INT) GO CREATE TRIGGER dbo.TestAudit_Trigger ON dbo.TestAudit FOR INSERT AS BEGIN SELECT * FROM dbo.TestAudit; END GO
(四) 查詢Audit的記錄,這裡針對稽核ServerAudit的內容進行查詢:
--查詢 SELECT database_name, event_time, succeeded, server_principal_name, [object_name], [statement] FROM sys.fn_get_audit_file('F:\AuditLog\ServerAudit_*.sqlaudit', default, default)
(Figure2:操作記錄)
四.注意事項(Attention)
1. 稽核必須已存在,才能為它建立伺服器稽核規範。 伺服器稽核規範在建立之後處於禁用狀態。
2. CREATE SERVER AUDIT 語句位於事務範圍內。 如果對事務進行回滾,也將對該語句進行回滾。
3. 經過稽核的事件可以寫入事件日誌或稽核檔案。
4. 定義稽核時,將指定結果的輸出位置。 這是稽核的目標位置。 稽核是在禁用狀態下建立的,因此不會自動稽核任何操作。 啟用稽核後,稽核目標將從稽核接收資料,目標可以是檔案、Windows 安全事件日誌或 Windows 應用程式事件日誌。
5. 通過使用 Windows“事件檢視器”、“日誌檔案檢視器”或 fn_get_audit_file 函式來讀取稽核事件。
6. 如果在啟動稽核期間出現問題,則伺服器將不會啟動。 在這種情況下,可以在命令列中使用 –f 選項來啟動伺服器。
五.疑問(Questions)
1. 如何對*.sqlaudit這些日誌進行歸檔或者刪除內容呢?
2. 使用sys.fn_get_audit_file獲取到的event_time跟當前的時間不對應,什麼問題?
3. 使用sys.fn_get_audit_file為什麼獲取到的記錄有空的呢?如果說database_name為空到是還好解釋,因為有些操作可能是伺服器級別的,這個欄位為空到是說的過去,但是[object_name]和[statement]為什麼沒有內容呢?
(Figure3:空值)
4. 如果我建立表失敗了,為什麼返回的記錄中還是顯示成功的呢?,執行下面的SQL時返回了下面的錯誤資訊,但是記錄的succeeded欄位顯示為1。
--測試 CREATE TABLE dbo.TestAudit(Id INT) ; GO訊息2714,級別16,狀態6,第2 行
資料庫中已存在名為'TestAudit' 的物件。
(Figure4:建立表失敗)
5. Audit與C2是什麼關係呢?
6. C2禁用的時候不能馬上生效,需要重啟資料庫服務,這是為什麼呢?
7. 如何修改C2日誌檔案的路徑?
解答:要想修改C2日誌檔案的路徑,那就先要知道這個預設的路徑在哪裡?在資料庫屬性中設定資料庫的預設位置,開啟C2開關,就能把類似audittrace20130710105730.trc的檔案儲存到下圖設定的路徑當中。
(Figure5:重設C2記錄檔案的儲存路徑)
(Figure6:路徑)