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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM