觸發器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;
