SQL Server Audit監控觸發器狀態


一.本文所涉及的內容(Contents)

  1. 本文所涉及的內容(Contents)
  2. 背景(Contexts)
  3. 實現代碼(SQL Codes)
  4. 注意事項(Attention)
  5. 疑問(Questions)
  6. 參考文獻(References)

二.背景(Contexts)

  DML觸發器一般會運用在業務系統的邏輯處理上,在你對數據庫用戶權限控制不當的時候,這些DML觸發器很可能莫名的被禁用或者刪除了,你作為數據庫管理員你想做冤大頭嘛?背黑鍋嘛?如果不想,下面給出4種解決方案:

1. 使用DDL觸發器對服務級別或者數據庫級別進行監控,可以參考文檔:SQL Server DDL觸發器運用,效果如下圖所示:

wps_clip_image-18803

(Figure1:觸發器的日志)

2. 也可以使用數據庫DDL事件通知,可以參考文檔:SQL Server 事件通知(Event notifications),效果如上圖所示;

3. 第三種方案就是變更數據捕獲(CDC),可以參考文檔:SQL Server 變更數據捕獲(CDC)監控表數據

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)

wps_clip_image-31207

(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]為什么沒有內容呢?

wps_clip_image-9127

(Figure3:空值)

4. 如果我創建表失敗了,為什么返回的記錄中還是顯示成功的呢?,執行下面的SQL時返回了下面的錯誤信息,但是記錄的succeeded字段顯示為1。

--測試 CREATE TABLE dbo.TestAudit(Id INT ) ; GO

消息2714,級別16,狀態6,第2 行

數據庫中已存在名為'TestAudit' 的對象。

wps_clip_image-19201

(Figure4:創建表失敗)

5. Audit與C2是什么關系呢?

6. C2禁用的時候不能馬上生效,需要重啟數據庫服務,這是為什么呢?

7. 如何修改C2日志文件的路徑?

解答:要想修改C2日志文件的路徑,那就先要知道這個默認的路徑在哪里?在數據庫屬性中設置數據庫的默認位置,開啟C2開關,就能把類似audittrace20130710105730.trc的文件保存到下圖設置的路徑當中。

wps_clip_image-9557

(Figure5:重設C2記錄文件的保存路徑)

8. 為什么修改了路徑之后的顯示是這樣的?Path Field Limits

wps_clip_image-10913

(Figure6:路徑)

六.參考文獻(References)

使用SQLServer Audit來監控觸發器的啟用、禁用情況

創建服務器審核和服務器審核規范

SQL Server 審核(數據庫引擎)

SQL Server 審核操作組和操作

CREATE SERVER AUDIT (Transact-SQL)

SQL 跟蹤

SQL Server Audit (Database Engine)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM