利用触发器实现日志记录
2006-08-27 17:47
246 查看
我们在做项目的过程中,很多时候都要涉及到 日志。
日志无非就是记录用户对数据的一些修改,新增,删除操作。所以,我们很容易联想到用触发器来实现。
假如现在日志需要记录当用户对userInfo表进行的upDate,Insert,Delete操作时的表名,时间,以及操作的表的关键字值,修改者。userInfo表结构如下:
日志表结构如下:
还有一个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表会同时产生,一个存储更新后的数据,一个存储更新前的数据。也正是触发器的这两个魔术表让我们用触发器来实现日志的记录具有魔术般的效果。
日志无非就是记录用户对数据的一些修改,新增,删除操作。所以,我们很容易联想到用触发器来实现。
假如现在日志需要记录当用户对userInfo表进行的upDate,Insert,Delete操作时的表名,时间,以及操作的表的关键字值,修改者。userInfo表结构如下:
用户信息表(userInfo) | ||||||||
Field | Type | Key | Fk | Uni | Null | Def | Note | |
1 | userName | varchar(20) | * | * | 员工姓名 | |||
2 | userPassword | varchar(16) | 员工密码 | |||||
3 | userSex | char(2) | 员工性别 |
Field | Type | Key | Fk | Uni | Null | Def | Note | |
1 | log_id | int | * | 日志记录序号(标识,自增) | ||||
2 | mdf_table_name | varchar(30) | 修改记录所在的表名 | |||||
3 | operate_type | char(1) | 是创建记录还是修改记录(0新建,1修改,2删除) | |||||
4 | mdf_time | datetime | 修改时间 | |||||
5 | record_key | varchar(20) | 修改记录的关键字段值 | |||||
6 | mender_name | varchar(20) | 修改者姓名 |
当用户新增一个用户时,我们可以创建如下触发器记录:
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表会同时产生,一个存储更新后的数据,一个存储更新前的数据。也正是触发器的这两个魔术表让我们用触发器来实现日志的记录具有魔术般的效果。
相关文章推荐
- Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录
- Laravel框架实现利用中间件进行操作日志记录功能
- 利用Annotation和Aop实现日志记录
- 通过触发器实现记录数据的修改日志
- 触发器实现记录操作表的日志
- 利用Annotation和Aop实现日志记录
- 通过自定义注解利用AOP在springmvc中实现记录日志
- SpringMVC利用AOP实现自定义注解记录日志
- MySQL用触发器实现日志记录
- 利用队列和定时器构造的一种日志记录模型实现
- [置顶] 利用Global.asax的Application_Error实现错误记录,错误日志
- 利用Laravel事件系统如何实现登录日志的记录详解
- oracle通过触发器实现登录登出日志记录
- SpringMVC利用AOP实现自定义注解记录日志
- SpringMVC利用AOP实现自定义注解记录日志
- 利用Spring AOP实现业务和异常日志记录
- EF利用重写SaveChanges()方法实现 审计日志记录
- 利用Global.asax的Application_Error实现错误记录,错误日志
- 利用特性功能实现简易的AOP日志记录功能