SQLServer 日志获取

fly_daniel 2013-01-30 02:48:16
在mysql中,可以通过开启log-output=TABLE,general-log=1的方式来把日志写入表中,那同理,在sqlserver中是否有这样的功能呢?小弟对sqlserver没有太多的使用经验,目前为了完成这个功能,需要这方面的值,烦请各位指点一二:
如何能够以sql语句的方式去获取一段时间内对库的操作语句,我需要的是在一个时间点的操作语句就可以了。
...全文
535 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yang_k 2013-08-23
  • 打赏
  • 举报
回复
LongRui888 2013-02-01
  • 打赏
  • 举报
回复 1
引用 6 楼 zdy123yy 的回复:
引用 3 楼 yupeigu 的回复:在SQL Server中没什么办法,日志传送里的日志一般情况下我们是解析不了的,只有通过SQL Server自己,或者是第三方工具来解析,不可能像MySql或者oracle那样直接取得日志对应的SQL 语句。 另外,触发器到是可以考虑的,但是应该会影响性能,所以这方面SQL Server还有待加强。 触发器的话,应该也是获……
这个触发器只能限制或者允许某些操作,确实不能记录已经执行的SQL语句,还有一个办法是审核,通过设置服务器审核规范,再设置数据库审核规范,能够记录下当前数据库的各种操作,包括update、insert、delete、select语句,你可以试试
LongRui888 2013-02-01
  • 打赏
  • 举报
回复
引用 5 楼 zdy123yy 的回复:
引用 2 楼 DBA_Huangzj 的回复:如果只要sql操作,那么DML和DDL触发器就可以了。把触发器记录到表里面。 嗯,我需要的是sql操作的语句,哪种操作类型是的确可以直接通过触发器获取的,就是语句有点麻烦
我写了一个例子,你可以参考一下:

--1.1创建服务器审核对象的操作,必须在master数据库中执行
use master
go


--1.2创建服务器审核对象
create server audit wcc_server_audit
to file
 (
  filepath = 'C:\',         --审核日志的文件路径,或者:APPLICATION_LOG,SECURITY_LOG 
  maxsize  = 500MB,         --审核文件可以增大到的最大大小
  max_rollover_files = 10,  --保留在文件系统中,外加当前文件的最大文件数
  reserve_disk_space = off  --按MAXSIZE值为磁盘上的文件预先分配大小
 )
with 
 (
  queue_delay = 1000,     --确定在强制处理审核操作之前,可以延迟的毫秒数
  on_failure = continue   --当不能写入目标时,sql实例是否关闭
 )
 


--2.创建服务器审核规范,捕获实例范围的事件
create server audit specification wcc_server_audit_specification 
for server audit wcc_server_audit 
 --add (SERVER_ROLE_MEMBER_CHANGE_GROUP),
 --ADD (DBCC_GROUP),
 --ADD (BACKUP_RESTORE_GROUP) 
WITH (STATE = ON ) 

 
--3.创建数据库审核规范,捕获数据库范围的事件
create database test
go

use test
go

create database audit specification wcc_database_audit_specification
for server audit wcc_server_audit
 --add (DATABASE_PRINCIPAL_IMPERSONATION_GROUP), --跟踪所有模拟行为
 add (insert,update,delete,select,execute 
      on schema::dbo by dbo)
with 
 (state = on )

 
 
alter database audit specification wcc_database_audit_specification
with (state = off)


alter database audit specification wcc_database_audit_specification
add (insert,
     update,
     delete, --包含了:delete、truncate table
     select,
     execute 
     on schema::dbo by dbo)



alter database audit specification wcc_database_audit_specification
add (SCHEMA_OBJECT_CHANGE_GROUP) --有:create、drop、alter(alter、truncate table)


/*
alter database audit specification wcc_database_audit_specification
drop (insert,
     update,
     delete, --包含了:delete、truncate table
     select,
     execute 
     on schema::dbo by dbo)

alter database audit specification wcc_database_audit_specification
drop (SCHEMA_OBJECT_CHANGE_GROUP) --有:create、drop、alter(alter、truncate table)
*/
 
alter database audit specification wcc_database_audit_specification
with (state = on)   
go


 
--注意:无法从用户数据库中对服务器审核执行更改,
--此操作必须在 master 数据库中执行。
use master
go

--5.开启服务器审核
alter server audit [wcc_server_audit]
with (state = on )

 
 
 --6.下面这些操作都能审核
 use test
 go
 
 
 create table tt1(v1 int,v2 datetime,v3 numeric(10,0))
 

 insert into tt1
 values(1,GETDATE(),123)
 
 update tt1
 set v3 = 100

 delete from tt1 
 
 truncate table tt1  --会有2条,一条是DL:就是delete,一条是AL:就是alter
 
 
 create table tttt(v int)
 
 drop table ttt
 
 select *
 from tttt
 

--显示记录的信息,需要去重,因为会有重复信息
 select distinct
                
        af.event_time,
        af.statement,
        --af.action_id,
        af.session_id,
        
        af.server_principal_id,
        af.database_principal_id,
        
        af.target_server_principal_id,
        af.target_database_principal_id,
        
        af.session_server_principal_name,
        af.server_principal_name,
        af.database_principal_name,
        
        af.target_server_principal_name,  
        
        af.server_instance_name,
        af.database_name,
        af.schema_name,
        af.object_name,
        af.object_id,
        af.class_type,
        
        af.file_name,
        af.audit_file_offset
        
from fn_get_audit_file('C:\wcc_server_audit_*',
                       default,
                       default) af
--inner join sys.dm_audit_actions aa
--        on aa.action_id = af.action_id
--          and aa.class_desc = af.class_
where 1=1
      --aa.name in ('INSERT','UPDATE','SELECT','DELETE')
      --and aa.class_desc = N'OBJECT'
      --and af.schema_name = 'dbo'
      --and af.object_name = ''
order by 1 desc
  
LongRui888 2013-02-01
  • 打赏
  • 举报
回复
引用 6 楼 zdy123yy 的回复:
引用 3 楼 yupeigu 的回复:在SQL Server中没什么办法,日志传送里的日志一般情况下我们是解析不了的,只有通过SQL Server自己,或者是第三方工具来解析,不可能像MySql或者oracle那样直接取得日志对应的SQL 语句。 另外,触发器到是可以考虑的,但是应该会影响性能,所以这方面SQL Server还有待加强。 触发器的话,应该也是获……
去百度里输入:SQL Server 2008 数据库审核 就会有一些介绍的文章,很不错,应该基本上能满足你的应用需求的。
fly_daniel 2013-01-31
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
在SQL Server中没什么办法,日志传送里的日志一般情况下我们是解析不了的,只有通过SQL Server自己,或者是第三方工具来解析,不可能像MySql或者oracle那样直接取得日志对应的SQL 语句。 另外,触发器到是可以考虑的,但是应该会影响性能,所以这方面SQL Server还有待加强。
触发器的话,应该也是获取不到语句的,只能获取到操作类型,假如有类似于mysql的general-log或者oracle的审计功能就好了
fly_daniel 2013-01-31
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
如果只要sql操作,那么DML和DDL触发器就可以了。把触发器记录到表里面。
嗯,我需要的是sql操作的语句,哪种操作类型是的确可以直接通过触发器获取的,就是语句有点麻烦
fly_daniel 2013-01-31
  • 打赏
  • 举报
回复
引用 1 楼 Haiwer 的回复:
搜索下日志传送
这个,我查询了一下,没有合适的方式呀,我需要的是通过语句来获取sql操作记录
LongRui888 2013-01-31
  • 打赏
  • 举报
回复
在SQL Server中没什么办法,日志传送里的日志一般情况下我们是解析不了的,只有通过SQL Server自己,或者是第三方工具来解析,不可能像MySql或者oracle那样直接取得日志对应的SQL 语句。 另外,触发器到是可以考虑的,但是应该会影响性能,所以这方面SQL Server还有待加强。
發糞塗牆 2013-01-30
  • 打赏
  • 举报
回复
如果只要sql操作,那么DML和DDL触发器就可以了。把触发器记录到表里面。
昵称被占用了 2013-01-30
  • 打赏
  • 举报
回复
搜索下日志传送

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧