mysql 內建功能 觸發器 實驗
阿新 • • 發佈:2018-11-13
#準備表
命令表
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代表執行失敗 );
priv 欄位是許可權
sucess enum 是命令執行成功與否
另外一張命令錯誤表 記錄命令出錯資訊
err_cmd 命令命
err_time 命令的提交時間
CREATE TABLE errlog ( id INT PRIMARY KEY auto_increment, err_cmd CHAR (64), err_time datetime );
這兩張表都有關係的
插入記錄到cmd表 如果插入的命令記錄有錯誤 這條錯誤的記錄會插入到errlog表裡
在插入完之後做觸發器,判斷這條命令是否錯誤 插完之後sueess欄位如果為no,意味著這條命令記錄是錯誤的,就把錯誤記錄寫入到,
errlog表裡
#建立觸發器
觸發器提供兩個物件
1.NEW 代表新增進來的記錄
2. old 代表之前老的記錄
insert 都是新的記錄 都用new物件
alter 是用到老記錄和新紀錄 所以修改時候涉及用到old、new物件
new物件下面有相應的屬性 new.id 就是調新建記錄的id new.user 調新增記錄的user
new.success
delimiter // # 設定mysql結束語句符號為// CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW BEGIN IF NEW.success = 'no' THEN #等值判斷只有一個等號 INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ; #必須加分號,這裡加;也不會中斷mysql語句 END IF ; #必須加分號 END// # 結束觸發器語句 delimiter ; # 把mysql 結束語句符號 還原為;
上面的中間程式碼的語法類似於shell
判斷這個new.success欄位新增進來的記錄是否為no 如果為no執行then 下面的程式碼
if new.success ='no' then
執行的程式碼
end if ; 結束語句
mysql 結束語句符號都是;
delimiter 作用是宣告sql語句的結束符號 用任意符號都可以
delimiter // 宣告mysql結束語句符號 用// 不用;
#往表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 | 2018-11-12 05:28:46 | | 2 | useradd xxx | 2018-11-12 05:28:46 | +----+-----------------+---------------------+ 2 rows in set (0.00 sec)