mysql 內置功能 觸發器 實驗
阿新 • • 發佈:2018-11-13
關系 reat prim primary 等號 creat lte sof 觸發
#準備表
命令表
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 ( idINT 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)
mysql 內置功能 觸發器 實驗