delimiter %% # 修改结束符
create trigger [触发器名] [before/after] [insert/update/delete] on [表名]
for each row # 表示每往上面创建的表进行指定操作之后就执行下面 "begin...end" 里面的SQL语句
begin
[sql 语句]
end %%
delimiter ; # 将结束符改回来
触发器的命名(见明知意)
🥝创建一个往"t01"表内插入记录之前触发"sql"语句的触发器
delimiter %%
create trigger tri_before_insert_t01 before insert on t01
for each row
begin
[SQL语句]
end %%
delimiter ;
🥝创建一个在"t01"表删除记录之后触发"sql"语句的触发器
delimiter %%
create trigger tri_after_delete_t01 after delete on t01
for each row
begin
[sql语句]
end %%
delimiter ;
🥝创建一个在对"t01"表修改数据之前就触发"sql"语句的触发器
delimiter %%
create trigger tri_before_update_t01 before update on t01
for each row
[SQL语句]
end %%
delimiter ;
6.触发器示例
模拟 cmd 命令的执行, 执行失败则添加到错误日志中
🥝准备两张表"cmd"、"error_log"
create table cmd(idint primary key auto_increment,
user varchar(16)not null,
permi char(4)not null,
cmd varchar(60)not null,
sub_time datetime,
success enum("yes","no")not null default "no");
create table error_log(idint primary key auto_increment,
error_cmd varchar(60),
error_time datetime
);
🥝创建触发器,当"cmd"表中的"cuccess"字段是"no",那么将触发执行"error_log"表的插入操作
delimiter %%
create trigger tri_after_insert_cmd after insert on cmd
for each row
begin
if new.success="no" then # 如果即将插入的记录的"success"字段是"no",则执行下面的语句
insert error_log(error_cmd,error_time) value(new.cmd,new.sub_time);# 加分号
end if;
end %%
delimiter ;
🥝开始模拟插入记录
insert cmd(user,permi,cmd,sub_time,success) value
("shawn","0644","ls -l /root",now(),"yes"),("shawn","0644","ps -elf",now(),"yes"),("shawn","0644","groupadd xing",now(),"no"),("shawn","0644","cat /etc/gshadow",now(),"no");
🥝查看"error_log"
select *from error_log;