1. 介紹
觸發器是與表有關的資料庫物件,指在 insert / update / delete之前(BEFORE) 或之後(AFTER),觸發並執行觸發器中定義的SQL語句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性, 日誌記錄 , 資料校驗等操作 。
使用別名 OLD 和 NEW 來引用觸發器中發生變化的記錄內容,這與其他的資料庫是相似的。現在觸發器還只支援行級觸發,不支援語句級觸發。
2. 語法
- 建立
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl_name FOR EACH ROW -- 行級觸發器
BEGIN
trigger_stmt ;
END;
- 檢視
SHOW TRIGGERS ;
- 刪除
DROP TRIGGER [schema_name.]trigger_name ;
-- 如果沒有指定 schema_name,預設為當前資料庫 。
3. 案例
透過觸發器記錄 tb_user 表的資料變更日誌,將變更日誌插入到日誌表 user_logs 中, 包含增加, 修改 , 刪除 ;
- 插入資料觸發器
create trigger tb_user_insert_trigger
after insert on tb_user for each row
begin
insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'insert', now(), new.id, concat('插入的資料內容為:
id=',new.id,',name=',new.name, ', phone=', NEW.phone, ', email=', NEW.email, ',
profession=', NEW.profession));
end;
測試:
-- 檢視
show triggers ;
-- 插入資料到tb_user
insert into tb_user(id, name, phone, email, profession, age, gender, status,
createtime) VALUES (26,'三皇子','18809091212','erhuangzi@163.com','軟體工
程',23,'1','1',now());
測試完畢之後,檢查日誌表中的資料是否可以正常插入,以及插入資料的正確性。
- 修改資料觸發器
create trigger tb_user_update_trigger
after update on tb_user for each row
begin
insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'update', now(), new.id,
concat('更新之前的資料: id=',old.id,',name=',old.name, ', phone=',
old.phone, ', email=', old.email, ', profession=', old.profession,
' | 更新之後的資料: id=',new.id,',name=',new.name, ', phone=',
NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession));
end;
測試:
-- 檢視
show triggers ;
-- 更新
update tb_user set profession = '會計' where id = 23;
update tb_user set profession = '會計' where id <= 5;
測試完畢之後,檢查日誌表中的資料是否可以正常插入,以及插入資料的正確性。
- 刪除資料觸發器
create trigger tb_user_delete_trigger
after delete on tb_user for each row
begin
insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'delete', now(), old.id,
concat('刪除之前的資料: id=',old.id,',name=',old.name, ', phone=',
old.phone, ', email=', old.email, ', profession=', old.profession));
end;
測試:
-- 檢視
show triggers ;
-- 刪除資料
delete from tb_user where id = 26;
測試完畢之後,檢查日誌表中的資料是否可以正常插入,以及插入資料的正確性。