mysql之觸發器trigger詳解
阿新 • • 發佈:2022-02-04
觸發器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;