Audit是SQL Server 2008以后才有的功能,它能告诉你“谁何时作了什么事情”。具体是指审核SQL Server 数据库引擎实例或单独的数据库涉及到跟踪和记录数据库引擎中发生的事件。它的底层是基于扩展事件(Extented Event),因此其性能和灵活性相对较好。审核数据能够输出到审核文件、Windows安全日志和应用程序日志。sql
Audit都须要建立一个实例级的“SQL Server审核”,而后能够建立从属于它“服务器审核规范”和“数据库审核规范”。能够理解“SQL Server审核”是审核的顶级容器,这两个“规范”是定义要审核的具体内容。数据库
建立和使用审核的通常过程:安全
1. 建立审核并定义目标。服务器
2. 建立映射到审核的服务器审核规范或数据库审核规范,并启用审核规范。session
3. 启用审核。编辑器
4. 经过使用 Windows“事件查看器”、“日志文件查看器”或 fn_get_audit_file 函数来读取审核事件。ide
建立测试数据库和数据:函数
use master go create database AuditTest go use AuditTest go create table tb(ID int primary key ,name varchar(20),weight decimal(10,2)); insert into tb values(1,'John',70.2),(2,'Ted',80.8),(3,'Clark',75.1) go
1. 建立审核和定义目标。性能
建立审核能够用SSMS或者语句实现。所谓目标,就是审核输出存到哪里,与扩展事件的Target差很少。测试
对应的语句建立:
--create Server Audit USE [master] GO CREATE SERVER AUDIT [Audit-AuditTest] TO FILE ( FILEPATH = N'D:\share' ,MAXSIZE = 50 MB ,MAX_FILES = 10 ,RESERVE_DISK_SPACE = ON ) WITH ( QUEUE_DELAY = 1000 ,ON_FAILURE = CONTINUE --AUDIT_GUID=uniqueidentifier ) --WHERE object_name='tb' GO --Enable Server Audit alter server audit [Audit-AuditTest] with (state=on)
简单说明一下相关参数:
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和表结构修改操做都被审核。
对应的语句:
--Create and enable Database Audit Specification USE [AuditTest] GO CREATE DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-AuditTest] FOR SERVER AUDIT [Audit-AuditTest] ADD (SCHEMA_OBJECT_CHANGE_GROUP), ADD (SELECT,DELETE,INSERT,UPDATE ON OBJECT::[dbo].[tb] BY [public]) WITH (STATE=ON) GO
对照SSMS,参数的意义就很明白了。更详细内容参考:CREATE DATABASE AUDIT SPECIFICATION
审核活动类型(Audit Action Type)参考:SQL Server 审核操做组和操做
3. 启用审核
SQL Server在建立审核和审核规范时,默认是不启用,须要显式启用。在前面两步,我已经显式启用了。
4. 测试和查看审核数据
use AuditTest go select * from dbo.tb where ID=1; update dbo.tb set name='Ted_New' where ID=2; alter table dbo.tb alter column name varchar(30); alter table dbo.tb add newCol varchar(20); go
在前面目标定义的文件中会生成一个审核文件,文件名:[SQL Server审核名称]_[审核的GUID]_*.sqlaudit。
这个文件也能够用其它文字编辑器打,可是不便阅读。一般使用系统函数sys.fn_get_audit_file读取它。
SELECT event_time , action_id , succeeded , session_id , session_server_principal_name , object_name , statement , file_name , audit_file_offset from sys.fn_get_audit_file('d:\share\*',default,default)
从结果能够获得:谁在何时作了什么。Select和Alter语句只有一条记录。Update有两条记录,一条Select和一条Update。将audit_file_offset的值传递给fn_get_audit_file做为第三个参数值,能够实现从指定的offset读取审核文件。注意:event_time输出为UTC时间了。
固然也能够直接查看:
5. 尝试服务器审核规范
审核建立和删除登陆,并将审核内容记录到应用程序日志。
USE [master] GO CREATE SERVER AUDIT [Audit-AuditTest] TO APPLICATION_LOG WITH ( QUEUE_DELAY = 1000 ,ON_FAILURE = CONTINUE ) GO Alter SERVER AUDIT [Audit-AuditTest] With(State=On) go Create Server Audit Specification SAS_CreateDropLogin For Server Audit [Audit-AuditTest] Add (SERVER_PRINCIPAL_CHANGE_GROUP) With (State=On) go create login xx with password='P@ssW0rd'; drop login xx ;
经过Windows的事件查看器,能够查看到33205事件。我的以为在查看数据详细事件时,使用XML格式更好理解一些。