功能说明:
建立一个log表,要记录如下信息:访问时间,执行的Sql语句,连接的时候使用的哪个Sql登陆用户,客户端的机器名,客户端的IP,客户端的登陆用户(OS的用户),是从查询分析器,还是应用程序来执行的,执行的是Select,Update,还是Delete操作,执行sql语句共花费了多少时间,影响了多少行数据,是否启动了事务,就像事件探测器记录的那些信息一样。使用触发器完成记录各步的操作。
下面是SQL语句及每步的作用说明:
--建立日志表
create table TbLog(
Id int not null IDENTITY(1,1),
EvTime datetime not null default (getdate()), --访问时间
Sql varchar(3000), --执行的Sql语句
UserId varchar(50) not null default (sUSER_sname()), --连接的时候使用的哪个Sql登陆用户
HostName varchar(50) not null default (host_name()), --客户端的机器名
Ip varchar(50), --客户端的IP
LoginId varchar(50), --客户端的登陆用户(OS的用户)
AppName varchar(50) not null default(App_Name()), --是从查询分析器,还是应用程序来执行的
OpType int, --执行的是Select,Update,还是Delete操作
RowCnt int, --影响了多少行数据
Trans bit --是否启动了事务
)
go
--测试表
create table
www.Supidea.com(
a int,
b varchar(10)
)
go
--触发器
create trigger tr_www.Supidea.com on
www.Supidea.com
for insert,delete,update
as
--RowCnt
declare @Rows int
set @Rows=@@rowcount
set nocount on
--Sql
create table #t (
EventType varchar(20),
Parameters int,
EventInfo varchar(3000)
)
insert #t exec('DBCC INPUTBUFFER(@@SPID)')
--OpType
declare @OpType int
set @OpType=2 --update
if not exists (select 1 from inserted) set @OpType=3 --delete
if not exists (select 1 from deleted) set @OpType=1 --delete
--Trans
declare @Trans bit
if @@TRANCOUNT>0
set @Trans=1
else
set @Trans=0
--insert
insert tbLog (
Sql,
OpType,
RowCnt,
Trans
)
select EventInfo,
@OpType,
@Rows,
@Trans
from #t
go
--先在企业管理器输入两条记录
--a b
--1 1
--2 2
--再执行语句:
insert
www.Supidea.com
values(3,'3')
go
insert
www.Supidea.com
select a+3,b+'3' from
www.Supidea.com
go
BEGIN TRANSACTION
update
www.Supidea.com
set a=100,b='100'
where a=3
COMMIT TRANSACTION
go
delete
www.Supidea.com
where a=4
go
select * from
www.Supidea.com
go
select * from tbLog
go
本文内容引用自 怎样写一个全局触发器,记录所有的操作,包括客户端来源等信息?
原文地址:
http://topic.csdn.net/t/20030726/11/2074138.html