本来想要的功能,是想对用户表密码字段发起的查询,都生成一个审计记录。
数据库版本如下,即(SQL Server 2008 R2 + SP1 + CU6):
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2811.0 (Intel X86) Apr 6 2012 02:04:21
Copyright (c) Microsoft Corporation Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
看帮助文档,网上搜索相关信息,打补丁,折腾了差不多一整天,得出了这么个坑爹的结论:
1. 如果查询的内容是以参数的形式执行,那么生成的审核记录,根本得不到这个参数的值;
2.不能对指定字段的进行审核,例如我想只审核用户表的密码字段的查询。这个根本做不到。
这个问题,在微软的bug库中,也有很多人反映:
--创建一个服务器审核
use master
go
CREATE SERVER AUDIT DML_Audit
TO FILE (FILEPATH='D:\XIAOTest\DML_Audit\',MAXSIZE=5MB,MAX_ROLLOVER_FILES=30)
go
alter SERVER AUDIT DML_Audit with (state=on)
go
--创建一个数据库审核规范:DML审核
use mydb
go
CREATE database AUDIT SPECIFICATION SELECT_Audit_Spec
FOR SERVER AUDIT DML_Audit
ADD (SELECT ON dbo.tbUser by dbo,xiao)
WITH (state = ON)
GO
--然后分别执行如下语句以生成审核记录:
select * from tbuser
select * from tbuser where userid='000005'
exec dbo.tbUser_GetUserInfo '系统管理员'
--然后这坑爹的审核记录出来了:
第二行与第三行正常,第四行审核出来的就是执行的存储过程tbUser_GetUserInfo里面的内容:
select a.*,b.DeptName from tbUser a left join tbDept b on a.DeptID=b.DeptID where a.UserName=@UserName
丫的,传入参数,这坑爹的SQL Server 2008 R2根本追踪不出这个具体的参数值!我很想当面问一下开发这个破功能的人:要这个审核功能有什么用?微软使用这个功能在什么实践中?
坑爹的审核,还不止如此:
SQL Server 2008 R2的在线帮助文档“ALTER DATABASE AUDIT SPECIFICATION”,有写这样的例子,可以指定某个字段进行审核:
但实际上,当你这么干时,却会出现错误33211:
消息 33211,级别 15,状态 1,第 0 行
不能为实体级审核指定子实体(如列)的列表。