您的位置:首页 > 数据库

利用触发器实现日志记录

2006-08-27 17:47 246 查看
我们在做项目的过程中,很多时候都要涉及到 日志。

日志无非就是记录用户对数据的一些修改,新增,删除操作。所以,我们很容易联想到用触发器来实现。

假如现在日志需要记录当用户对userInfo表进行的upDate,Insert,Delete操作时的表名,时间,以及操作的表的关键字值,修改者。userInfo表结构如下:

 用户信息表(userInfo)
 FieldTypeKeyFkUniNullDefNote
1userNamevarchar(20)* *  员工姓名
2userPasswordvarchar(16)     员工密码
3userSexchar(2)     员工性别
日志表结构如下:

 FieldTypeKeyFkUniNullDefNote
1log_idint*    日志记录序号(标识,自增)
2mdf_table_namevarchar(30)     修改记录所在的表名
3operate_typechar(1)     是创建记录还是修改记录(0新建,1修改,2删除)
4mdf_timedatetime     修改时间
5record_keyvarchar(20)     修改记录的关键字段值
6mender_namevarchar(20)     修改者姓名
还有一个CurrentUser 表,存放当前操作的用户。

当用户新增一个用户时,我们可以创建如下触发器记录:

create trigger log_userInfo_insert
on userInfo
for insert
as
begin
declare @userName varchar(20),@NewUser varchar(20)
 select @userName=userName from CurrentUser
 select @NewUser=userName from inserted
 insert into logInfo(mdf_table_name,operate_type,mdf_time,mender_name,record_kye)
 values('userInfo',0,GetDate(),@userName, @NewUser)
end

当用户删除一个用户时,我们也可以记录:

create trigger log_userInfo_del
on userInfo
for delete
as
begin
declare @userName varchar(20),@DelUser varchar(20)
select @userName=userName from CurrentUser
select @DelUser=userName from deleted
insert into logInfo(mdf_table_name,operate_type,mdf_time,mender_name,record_kye)
values('userInfo',1,GetDate(),@userName, @DelUser)
end

假如当用户修改了一个用户的用户名过后,我们需要记录修改前的用户名,我们可以这样记录:

create trigger log_userInfo_update
on userInfo
for update
as
begin
declare @userName varchar(20),@UpdateUser varchar(20)
select @userName=userName from CurrentUser
select @UpdateUser=userName from deleted
insert into logInfo(mdf_table_name,operate_type,mdf_time,mender_name,record_kye1)
values('userInfo',2,GetDate(),@userName, @UpdateUser)
end

写到这里,不得不谈一下触发器中的魔术表。每个触发器都有两个特殊的表:插入表(inserted)和删除表(deleted)。他们也叫魔术表。这两个是逻辑表,又系统管理,存储在内存中,不是存储在数据库中,表结构和用户操作的表的结构一样。用户不能修改,但可以去读,当触发器完成他们也被删除。这两个表主要保存因用户操作而被影响到的原始数据或新数据。所以当定义insert触发器的时候,就会有一个inserted表记录用户插入的内容,当定义delete触发器的时候就会有一个deleted表。不同的是,更新操作,也就是update触发器包括两个部分,既先将更新的内容删除,然后在将新值插入,所以在update触发器中,inserted和deleted表会同时产生,一个存储更新后的数据,一个存储更新前的数据。也正是触发器的这两个魔术表让我们用触发器来实现日志的记录具有魔术般的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息