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

mysql內置功能—觸發器

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內置功能—觸發器