mysql內置功能—觸發器
阿新 • • 發佈:2019-01-07
rem into value upd useradd new 數據 pda 判斷
一 觸發器
使用觸發器可以定制用戶對表進行【增、刪、改】操作時前後的行為,註意:沒有查詢
一 創建觸發器
# 插入前(insert行為觸發之前) CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW # tri_before_insert_tb1觸發器名 BEGIN ... END # 插入後(insert行為之後) CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW BEGIN ... END # 刪除前 CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW BEGIN ... END # 刪除後 CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW BEGIN ... END # 更新前 CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW BEGIN ... END # 更新後 CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW BEGIN ... END
#準備表 CREATE TABLE cmd ( id INT PRIMARY KEY auto_increment, USER CHAR (32), priv CHAR (10), cmd CHAR (64), sub_time datetime, #提交時間 success enum (‘yes‘, ‘no‘) #0代表執行失敗 ); CREATE TABLE errlog ( # 記錄出錯 id INT PRIMARY KEY auto_increment, err_cmd CHAR (64), err_time datetime ); #創建觸發器 delimiter // # 聲明結束符號改為// CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW BEGIN IF NEW.success = ‘no‘ THEN # 等值判斷只有一個等號 new代表新增進來的記錄,old代表之前老的記錄 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 (‘egon‘,‘0755‘,‘ls -l /etc‘,NOW(),‘yes‘), (‘egon‘,‘0755‘,‘cat /etc/passwd‘,NOW(),‘no‘), (‘egon‘,‘0755‘,‘useradd xxx‘,NOW(),‘no‘), (‘egon‘,‘0755‘,‘ps aux‘,NOW(),‘yes‘);
#查詢錯誤日誌,發現有兩條 mysql> select * from errlog; +----+-----------------+---------------------+ | id | err_cmd | err_time | +----+-----------------+---------------------+ | 1 | cat /etc/passwd | 2017-09-14 22:18:48 | | 2 | useradd xxx | 2017-09-14 22:18:48 | +----+-----------------+---------------------+ rows in set (0.00 sec)
特別的:NEW表示即將插入的數據行,OLD表示即將刪除的數據行。
二 使用觸發器
觸發器無法由用戶直接調用,而知由於對表的【增/刪/改】操作被動引發的。
三 刪除觸發器
drop trigger tri_after_insert_cmd;
mysql內置功能—觸發器