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

mysql 內建功能 觸發器 實驗

 

 

#準備表
命令表
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)