怎么查「谁做了什么」:SQL Server 审计怎么用
SQL Server 审计(Audit)的机制:记录谁连了、跑了什么语句、改了谁的对象,审计规范怎么建、审计事件到哪查,以及审计的代价。
结论先行
「谁在什么时间对哪个库做了什么」这类问题,靠**服务器级审计(Server Audit)**回答:建一个审计规范指定要记录的事件类(登录、对象操作、语句执行等),引擎把审计事件写入指定目标(文件/Windows 日志/…),之后按时间线查询即可。它是事件驱动记录,不是实时盯梢——代价是持续的写 I/O 与存储。
三层概念
| 概念 | 作用 |
|---|---|
| 审计(Audit) | 一个记录目标(文件、Windows 事件日志等) |
| 审计规范(Audit Specification) | 决定「记什么」:服务器级/数据库级,勾选事件类 |
| 审计事件 | 实际产生的记录条目,落到审计目标里 |
开启路径(SSMS)
- SSMS 管理工具条目 中 安全性 → 服务器审计 → 新建审计,指定输出目标(文件路径);
- 新建「服务器审计规范」,勾选事件:登录/登出失败、对象变更、语句执行(
STATEMENT类粒度最细); - 启用规范;对库内操作建「数据库审计规范」。
查审计记录
-- 用系统函数读审计文件(审计目标为文件时)
SELECT event_info, event_time
FROM sys.fn_get_audit_file(N'D:\audit\*', NULL, NULL)
ORDER BY event_time DESC;
按 event_type、server_principal_name、event_time 过滤即可还原「某人某时对某对象做了什么」。
代价与边界
全量
STATEMENT审计在高并发库上写放大明显——生产上按风险面裁剪事件类(登录失败、DDL 变更必记,高频 DML 慎开)。
- 审计目标文件权限要收好(它本身是明文事件,含账号名);
- 审计是「事后取证」,不是拦截——防破坏还得靠权限(最小权限相关条目);
- 审计功能属引擎特性,各版本支持范围以 SQL Server 2022 Developer、SQL Server 2025 Developer 等条目页说明为准。