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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值