用触发器写日志记录

什么是触发器

触发器可以简单的理解为一个与数据表有关的数据库实例,它会在满足定义条件时触发,并执行触发器中定义的语句。它的执行不是由程序调用,也不是手动执行,而是由事件来触发。
触发器在创建时需要指定以下要素:

  • 监视的数据表(table)
  • 监视的事件(insert/update/delete)
  • 触发的时间(after/before)
  • 触发的事件(insert/update/delete)

触发器的缺点

触发器会在每次符合触发条件时执行一次,例如我们创建了一个在插入数据前执行的触发器,假设插入了1000条数据,那么触发器就会执行1000次,触发器执行的时间会远远大于插入使用的时间,这就会使得效率非常低效,大家在考虑使用触发器时一定要考虑效率问题。


下面我们通过一个日志记录表来熟悉触发器

首先先创建一个学生表

包含属性id,姓名,性别,年龄

create table student(id int primary key auto_increment,name varchar(20),sex enum("male","female"),age int);

创建一个触发器,不允许年龄小于0或者大于100
在插入前将年龄小于0的年龄改为0,大于100的改为100

delimiter % 
create trigger student_age before insert on student for each row begin if new.age > 100 then set new.age = 100;elseif new.age<0 then set new.age = 0;end if;end %
delimiter ;

插入多条数据

insert into student values(null,"jack","male",-1),(null,"mack","male",18),(null,"rose","female",21),(null,"marry","female",110);

查看表,发现年龄大于100的被修改为100,小于0的被修改为0

select * from student;

在这里插入图片描述

创建一个触发器记录日志信息

首先创建一个记录日志的表
包含属性id,用户,行为,时间

create table student_log(l_id int primary key auto_increment,l_user varchar(20),l_action enum("insert","update","delete"),l_time datetime);

创建触发器,在插入删除修改后将日志记录到日志表中。

delimiter %
create trigger ins_trigger after insert on student for each row begin insert into student_log value(null,user(),"insert",now()); end%

 create trigger up_trigger after update on student for each row begin insert into student_log value(null,user(),"update",now()); end%

create trigger del_trigger after delete on student for each row begin insert into student_log value(null,user(),"delete",now()); end%
delimiter ;

测试触发器

插入数据

insert into student value(null,"zack","male",22);

修改数据

update student set age=17 where name="zack";

删除数据

delete from student where id = 8;

查看日志表

select * from student_log;

在这里插入图片描述
查看创建的触发器

show triggers;

删除触发器

drop trigger 触发器名

猜你喜欢

转载自blog.csdn.net/weixin_42494845/article/details/105874443