如何使用 SQL Server Audit 功能

Ivan Cheng
7 min readFeb 15, 2023

在預設情況下,使用者操作資料庫的動作並不會被記錄下來。雖然我們可以使用觸發程序之類的功能來進行偵測,但是設定起來還是相當繁瑣。

因此我們可以使用 SQL Server Audit 功能對伺服器或者資料庫物件進行查詢、新增、更新與刪除等動作的稽核,將其記錄到檔案或者 Window 應用程式的事件紀錄。

建立稽核

從物件總管中點選執行個體 > 安全性 > 稽核,新增稽核。

這個稽核是用於定義蒐集到的稽核紀錄如何儲存,選項包含

  • File
  • Windows Security Log
  • Windows Application Log

建議調整稽核檔案數目上限及檔案大小上限,避免磁碟空間被塞滿導致系統發生異常。

剛被建立的稽核會處於停用狀態,必須要啟用紀錄才能夠被保存。

新增伺服器稽核規格

從物件總管中點選執行個體 > 安全性 > 伺服器稽核規格,新增伺服器稽核規格。

輸入伺服器稽核規格的名稱並選擇上面所建立的稽核

假設我們想要稽核資料庫或者資料表執行 CREATE、ALTER 或 DROP 陳述式時,選擇以下稽核動作群組名稱。

  • DATABASE_OBJECT_CHANGE_GROUP
  • SCHEMA_OBJECT_CHANGE_GROUP

關於稽核動作群組名稱的詳細描述,請參考此篇文章。

完成伺服器稽核規格設定後,一樣需要啟用才會開始進行稽核。
需要注意的是伺服器稽核規格與稽核都必須要同時啟動,才能夠正確紀錄。

檢視稽核紀錄

確認建立資料庫與資料表的動作是否會被稽核記錄

利用下列的 T-SQL 指令碼建立資料庫

USE [master]
GO

CREATE DATABASE [Database_1]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'Database_1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Database_1.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'Database_1_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Database_1_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO

利用下列的 T-SQL 指令碼建立資料表

USE [Database_1]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table_1](
[Column_1] [nchar](10) NULL
) ON [PRIMARY]

GO

從物件總管中點選執行個體 > 安全性 > 稽核,檢視稽核紀錄。

確認建立資料庫與資料表的動作都被稽核記錄下來了

資料庫的稽核紀錄
資料表的稽核紀錄

新增資料庫稽核規格

伺服器稽核規格會針對該伺服器底下的所有物件生效,若只想針對特定資料庫進行稽核紀綠,可以使用資料庫稽核規格。

從物件總管中點選執行個體 > 資料庫 > 安全性 > 資料庫稽核規格, 新增伺服器稽核規格。

輸入資料庫稽核規格的名稱並選擇上面所建立的稽核

假設我們想要稽核資料表執行 DELETE 陳述式時,選擇 DELETE 動作名稱。

資料庫層級的設定必須明確指明要稽核的物件類別、結構描述及名稱,同時必須明確指定要稽核的主體名稱(Principal Name)。

按下確定後,跑出此版本的 SQL Server 不提供更細微的稽核功能。

原來資料庫層級的稽核僅在 SQL Server 企業版中才可使用

乖乖用 Trigger 吧你

相信大家已經學會了如何使用 SQL Server Audit 功能來追蹤資料庫的軌跡,希望有幫助大家。

參考文件

--

--

Ivan Cheng

動若不止,止水皆化波濤;靜而不擾,波濤悉為止水。水相如此,心境亦然。