触发器是与表相关的数据库对象,指在insert/update/delete之前或者之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特征可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作
使用别名OLD和NEW来引发触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发
触发器类型 NEW和OLD的使用 INSERT型触发器 NEW表示将要或者已经新增的数据 UPDTE型触发器 OLD表示修改之前的数据,NEW表示将要或已经修改后的的数据 DELETE型触发器 OLD表示将要或者已经删除的数据
create trigger trigger_name -- trigger表示触发器 before/after insert/update/delete -- 在什么之前或之后执行 on tbl_name -- 监听的表名 [for each row] -- 行级触发器 begin trigger_stmt; -- 触发器的具体逻辑 end;
需求:通过触发器记录 emp 表的数据变更日志,包含增加,修改,删除
创建日志表:
create table emp_logs( id int(11) primary key auto_increment, operation varchar(20) not null comment '操作类型(insert/update/delete)', operation_time datetime not null comment '操作时间', operation_id int(11) not null comment '操作表的ID', operation_params varchar(500) comment '操作参数' );
创建insert型触发器,在完成数据插入操作时的日志记录
create trigger emp_logs_insert after insert on emp for each row begin insert into emp_logs(id, operation, operation_time, operation_id, operation_params) VALUES (null, 'insert', now(), NEW.id, concat('插入后:(id:', NEW.id, ',name:', NEW.name, ',age:', NEW.age, ',salary:', NEW.salary,')')); end; # 查看记录的的日志信息 select * from emp_logs where operation = 'insert';
创建update型触发器,在完成数据更新操作时的日志记录
create trigger emp_logs_update after update on emp for each row begin insert into emp_logs(id, operation, operation_time, operation_id, operation_params) VALUES (null, 'update_before', now(), OLD.id, concat('更新前的数据(id:', OLD.id, ',name:', OLD.name, ',age:', OLD.age, ',salary:', OLD.salary, ')')), (null, 'update_after', now(), NEW.id, concat('更新后的数据(id:', NEW.id, ',name:', NEW.name, ',age:', NEW.age, ',salary:', NEW.salary, ')')); end; # 执行修改操作 update emp set name = '奥巴马', age = 63 where id = 5; # 查看记录的日志 select * from emp_logs where operation like '%update%' and operation_id = 5;
创建delete型触发器,在完成数据的删除操作后记录对应的日志记录
create trigger emp_logs_delete after delete on emp for each row begin insert into emp_logs(id, operation, operation_time, operation_id, operation_params) VALUES (null, 'delete', now(), OLD.id, concat('删除的数据(id:', OLD.id, ',name:', OLD.name, ',age:', OLD.age, ',salary:', OLD.salary, ')')); end; # 执行删除操作 delete from emp where id = 5; # 查看记录的的日志 select * from emp_logs where operation = 'delete';
# 查看触发器 show triggers; # 删除触发器 drop trigger trigger_name;