我们在做项目的过程中,很多时候都要涉及到 日志。
日志无非就是记录用户对数据的一些修改,新增,删除操作。所以,我们很容易联想到用触发器来实现。
假如现在日志需要记录当用户对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) | 修改者姓名 |
还有一个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表会同时产生,一个存储更新后的数据,一个存储更新前的数据。也正是触发器的这两个魔术表让我们用触发器来实现日志的记录具有魔术般的效果。
本文介绍了如何利用数据库触发器来实现对数据修改、新增和删除操作的日志记录。通过创建insert、delete和update触发器,结合CurrentUserInfo表获取操作者信息,将表名、操作类型、时间戳、修改者和关键字段值存入日志表,确保日志完整且准确。


被折叠的 条评论
为什么被折叠?



