sql server 的审核可以通过跟踪 sql server 内部事件处理,通常用自带的 sql profiler 处理。sql server 2008 的 ssms 中有很方便的审核配置。如果要开发自己的审核程序,sql server 也提供了一些存储过程(sp_trace_*),也可以通过事件通知(Event Notifications,http://technet.microsoft.com/en-us/library/ms182602(SQL.90).aspx)实现。也可以通过 smo 实现。可以参考一下 http://technet.microsoft.com/en-us/library/ms130271(SQL.90).aspx
-- 此语句可以获取执行过的,并且当前仍在过程缓冲区中的 sql 语句、执行计划和相关的统计信息
select t.text,p.query_plan,
q.creation_time,q.last_execution_time,q.execution_count,
q.total_physical_reads,q.total_logical_reads,q.total_logical_writes,
q.total_elapsed_time,q.total_worker_time
from sys.dm_exec_query_stats q cross apply
sys.dm_exec_query_plan(q.plan_handle) p cross apply
sys.dm_exec_sql_text(q.sql_handle) t;-- 由于执行过的 sql 语句(特别是 ad-hoc 查询)并不会永久缓存在过程缓冲区中,因此 SQL Server 当前提
-- 供的动态性能视图不可能提供过去执行过的所有 sql 语句。
-- 如果想要获得执行过的所有 sql 语句,应该使用 SQL Profiler 跟踪。
2000中用dbcc inputbuffer
可以用SQL PROFILER来进行审计,将产生的trace信息放在数据库的一个表里面,读取表中的数据就可以了;或者也可以保持成trc文件,然后调用fn_get_traceinfo读取生成的trc文件。
我想审计,什么时间,谁,对数据库做了什么,具体执行的SQL语句!
请问我可以在什么地方得到这些信息,尽可能的对数据库性能影响很小!~
谢谢您拉!~
http://technet.microsoft.com/en-us/library/ms130271(SQL.90).aspx
是永久的,还是临时的呢。审计肯定会带来性能开销的,而且还要看你系统的负载大不大。
如果需要做的话,
1,采用c2 audit模式
sp_configure 'c2 audit mode', 1
go在安装目录的DATA文件夹里面就会产生相关的审计信息了,包括权限、登录、DDL,DML等语句。
想要获取TRC文件的话,用SELECT *
FROM ::fn_trace_gettable(
'C:\Program Files\Microsoft SQL Server\...\Data\audittrace_xxx.trc', default
)
GO就可以查看里面的信息,你也可以用select into,存储到具体的表里面,然后根据需要筛选吧。2,自定义的SQL PROFILER审计。
新建SQL PROFILER审计,只选择与SQL 相关的,如SQL:statementfinished(好像是这个),然后生成脚本,用脚本来运行,这样性能影响也会比较小的。然后也最好保存为trc文件,再用fn_trace_gettable来得到有关信息。其他的就看下SQL Profiler的联机丛书和使用帮助吧。最好先测试下,因为有时候审计的开销还是蛮大的。
猫兄,能不能再提供些SMO的资料呢,貌似很有意思。
http://msdn.microsoft.com/en-us/library/ms162565.aspx