mysql之触发器trigger详解

触发器trigger ❗

定义:在满足特点条件后自动执行。
在MySQL只有三种情况下可以触发
    1、针对表的增
    	增加数据前 增加数据后 可写一个触发器
    2、针对表的改
    	修改数据前 修改数据后
    3、针对表的删
    	删除数据前 删除数据后
        
        
# 语法结构
create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row begin
	sql语句
end

# 触发器的名字推荐使用下列方式(见名知意):
	tri_after_insert_t1  : 在给t1表插入数据之后添加一个触发器
# 六种情况演示
# 六种情况演示
增加:
create trigger tri_after_insert_t1 after insert on 表名 for each row
begin
	sql语句
end   # 增加之后触发

create trigger tri_before_insert_t1 before insert on 表名 for each row
begin
	sql语句
end   # 增加之前触发

修改:
create trigger tri_after_update_t1 after update on 表名 for each row
begin
	sql语句
end   # 修改之后触发

create trigger tri_before_updata_t1 before update on 表名 for each row
begin
	sql语句
end   # 修改之前触发

删除:
create trigger tri_after_delete_t1 after delete on 表名 for each row 
begin
	sql语句
end   # 删除之后触发

create trigger tri_before_delete_t2 before delete on 表名 for each row
begin
	sql语句
end   # 删除之前触发


补充:

需要注意:在书写sql语句的时候结束符是; 而整个触发器结束时也需要用到分号;就会出现语法冲突,需要修改我们的结束符号。
临时修改sql语句的结束符号:只在当前窗口有效
结构: delimiter 新符号
案例: delimiter $$

触发器案例:

补充:在mysql中new特指数据对象可以通过点(.)的方式获取字段对应的数据
eg  : id :1   name :gary  pwd :123  hobby :read
		NEW.name的结果就为 : gary 

# 模拟cmd命令表
create table cmd (
    id int primary key auto_increment,   # 主键字段
    USER char (32),
    priv char (10),   
    cmd char (64),   # cmd命令字段
    sub_time datetime, 	# 提交时间
    success enum ('yes', 'no')
);

# 错误日志表
create table errlog (
    id int primary key auto_increment,
    err_cmd char (64),
    err_time datetime
);

# 创建触发器
delimiter $$  # 将mysql默认结束符;换为$$
create trigger tri_afrer_insert_cmd after insert on cmd for each row  # 在insert插入数据之后创建触发器
begin  # 触发器代码
	if NEW.success = 'no' then  # mysql中if语句固定格式
		insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
	end if;
end $$
delimiter ;  # 结束触发器要把默认结束回来 不然后续操作容易混淆

# 往cmd表中插入数据,触发触发器,根据if的条件决定是否插入错误日志
insert into cmd (USER,priv,cmd,sub_time,success) values
                        ('tony','0755','ls -l /etc',NOW(),'yes'),
                        ('tony','0755','cat /etc/passwd',NOW(),'no'),
                        ('tony','0755','useradd xxx',NOW(),'no'),
                        ('tony','0755','ps aux',NOW(),'yes');

验证触发器:

# 查询errlog表记录
select * from errlog;
# 结果:在插入数据后自动给errlog表插入里两条数据 并且这两条数据为插入success为'no'的

# 查看触发器
show triggers;

# 删除触发器
格式:drop trigger 触发器名字;
eg: drop trigger tri_after_insert_cmd;
posted @ 2022-01-29 23:58  JasonBorn  阅读(4837)  评论(0编辑  收藏  举报