1. 程式人生 > >mysql 內置功能 觸發器 實驗

mysql 內置功能 觸發器 實驗

關系 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 (
    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)




mysql 內置功能 觸發器 實驗