MySQL触发器

1.触发器

1.1.介绍

触发器是与表相关的数据库对象,指在insert/update/delete之前或者之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特征可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作

使用别名OLD和NEW来引发触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发

触发器类型 NEW和OLD的使用
INSERT型触发器 NEW表示将要或者已经新增的数据
UPDTE型触发器 OLD表示修改之前的数据,NEW表示将要或已经修改后的的数据
DELETE型触发器 OLD表示将要或者已经删除的数据

1.2.创建触发器的语法

create trigger trigger_name -- trigger表示触发器
before/after insert/update/delete -- 在什么之前或之后执行
on tbl_name -- 监听的表名
[for each row] -- 行级触发器
begin
    trigger_stmt; -- 触发器的具体逻辑
end;

1.3.演示样例

需求:通过触发器记录 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';

1.4.触发器的查看和删除

# 查看触发器
show triggers;
# 删除触发器
drop trigger trigger_name;

你可能感兴趣的:(mysql,mysql,数据库)