1. 程式人生 > 其它 >mysql之觸發器trigger詳解

mysql之觸發器trigger詳解

觸發器trigger ❗

定義:在滿足特點條件後自動執行。
在MySQL只有三種情況下可以觸發
    1、針對表的增
    	增加資料前 增加資料後 可寫一個觸發器
    2、針對表的改
    	修改資料前 修改資料後
    3、針對表的刪
    	刪除資料前 刪除資料後
        
        
# 語法結構
create trigger 觸發器的名字 before/after insert/update/delete on 表名 for each row begin
	sql語句
end

# 觸發器的名字推薦使用下列方式(見名知意):
	tri_after_insert_t1  : 在給t1表插入資料之後新增一個觸發器
# 六種情況演示
# 六種情況演示
增加:
create trigger tri_after_insert_t1 after insert on 表名 for each row
begin
	sql語句
end   # 增加之後觸發

create trigger tri_before_insert_t1 before insert on 表名 for each row
begin
	sql語句
end   # 增加之前觸發

修改:
create trigger tri_after_update_t1 after update on 表名 for each row
begin
	sql語句
end   # 修改之後觸發

create trigger tri_before_updata_t1 before update on 表名 for each row
begin
	sql語句
end   # 修改之前觸發

刪除:
create trigger tri_after_delete_t1 after delete on 表名 for each row 
begin
	sql語句
end   # 刪除之後觸發

create trigger tri_before_delete_t2 before delete on 表名 for each row
begin
	sql語句
end   # 刪除之前觸發


補充:

需要注意:在書寫sql語句的時候結束符是; 而整個觸發器結束時也需要用到分號;就會出現語法衝突,需要修改我們的結束符號。
臨時修改sql語句的結束符號:只在當前視窗有效
結構: delimiter 新符號
案例: delimiter $$

觸發器案例:

補充:在mysql中new特指資料物件可以通過點(.)的方式獲取欄位對應的資料
eg  : id :1   name :gary  pwd :123  hobby :read
		NEW.name的結果就為 : gary 

# 模擬cmd命令表
create table cmd (
    id int primary key auto_increment,   # 主鍵欄位
    USER char (32),
    priv char (10),   
    cmd char (64),   # cmd命令欄位
    sub_time datetime, 	# 提交時間
    success enum ('yes', 'no')
);

# 錯誤日誌表
create table errlog (
    id int primary key auto_increment,
    err_cmd char (64),
    err_time datetime
);

# 建立觸發器
delimiter $$  # 將mysql預設結束符;換為$$
create trigger tri_afrer_insert_cmd after insert on cmd for each row  # 在insert插入資料之後建立觸發器
begin  # 觸發器程式碼
	if NEW.success = 'no' then  # mysql中if語句固定格式
		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
                        ('tony','0755','ls -l /etc',NOW(),'yes'),
                        ('tony','0755','cat /etc/passwd',NOW(),'no'),
                        ('tony','0755','useradd xxx',NOW(),'no'),
                        ('tony','0755','ps aux',NOW(),'yes');

驗證觸發器:

# 查詢errlog表記錄
select * from errlog;
# 結果:在插入資料後自動給errlog表插入裡兩條資料 並且這兩條資料為插入success為'no'的
# 檢視觸發器
show triggers;
# 刪除觸發器
格式:drop trigger 觸發器名字;
eg: drop trigger tri_after_insert_cmd;