觸發器
Level 1
用途
通過監視某種數據庫操作,根據該數據庫操作觸發其他操作的執行。
優點
- SQL語句中觸發器默認爲一個事務操作,具有原子性,可以綁定用戶輸入和觸發的兩個sql語句。
- 保證數據的完整性,約束數據庫中的數據。
- 可以利用數據庫語言來進行業務邏輯的構建。
缺點
- 使程序更爲複雜。
- 分擔了後端業務邏輯處理的功能,增加了耦合。
- 某些業務邏輯後期難以維護。
Level 2
創建語法四要素
- 監視地點:指定觸發器所在的表。
- 監視事件:設置需要監控的動作,增加(INSERT),更新(UPDATE),刪除(DELETE)。
- 觸發順序:觸發的SQL語句執行在輸入的SQL語句之前(BEFORE),之後(AFTER)。
- 觸發事件:自定義的SQL語句。
Level 3
觸發器工作流程
數據庫中存在Table-1,Table-2兩個表;
對Table-1操作的Sql-1語句,對Table-2操作的Sql-2語句;
Sql-1語句可以觸發Sql-2語句。
當用戶輸入or調用Sql-1語句時;流程如下所示:
- 操作被監控所獲取,進行判斷;
- 若觸發順序標識爲before,則先執行被觸發的Sql-2語句(2-2);再執行Sql-1語句(2-1)。
- 若觸發順序標識爲after,則先執行Sql-1語句(2-1);再執行Sql-2語句(2-2)。
Level 4
觸發器實例
業務背景:
有一個機構,機構中有若干學生,機構有官網,
想讓每個新加入的學生,自動獲取一個登陸賬號and密碼
設置:
- 創建學生表(student),創建用戶表(user)。
- 創建在學生表上創建觸發器(insert_user)。
- 向學生表中新增數據,檢測結果。
########################################################################CREATE-TABLE
DROP TABLE IF EXISTS `student`; ## 若學生表存在,清空該信息
CREATE TABLE `student`( ## 創建學生表
`id` int(30) NOT NULL AUTO_INCREMENT, ## id 字段設置
`name` varchar(255) DEFAULT NULL, ## name 字段設置
`description` varchar(255) DEFAULT NULL, ## description 字段設置
PRIMARY KEY(`id`) ## 主鍵設置
)ENGINE = InnoDB DEFAULT CHARSET=UTF8; ## 其他設置
DROP TABLE IF EXISTS `user`; ## 若用戶表存在,清空該表信息
CREATE TABLE `user` ( ## 創建用戶表
`id` int(20) NOT NULL AUTO_INCREMENT, ## id 字段設置
`student_id` int(20) NOT NULL, ## student_id 字段設置
`username` varchar(255) NOT NULL, ## username 字段設置
`password` varchar(255) NOT NULL, ## password 字段設置
PRIMARY KEY(`id`) ## 主鍵設置
)ENGINE = InnoDB DEFAULT CHARSET=UTF8; ## 其他設置
########################################################################CREATE-TABLE
######################################################################CREATE-TRIGGER
DROP TRIGGER IF EXISTS `insert_user`; ## 若該觸發器存在,則清空
DELIMITER $$ ## 更改語句結束符爲 $$
CREATE TRIGGER `insert_user` ## 創建觸發器 insert_user
AFTER ## 設置觸發器 觸發順序
INSERT ## 設置觸發器 監視事件
ON `student` ## 設置觸發器 監視地點
FOR EACH ROW ## 表示:每一行觸發一次
######################################## TRIGGER 觸發的SQL語句
BEGIN ## 開始
INSERT INTO ## 設置觸發器 觸發事件
`user` ## 設置觸發器 觸發事件
(student_id,username,password) ## 設置觸發器 觸發事件
VALUES ## 設置觸發器 觸發事件
(new.id,new.name,'123456'); ## 設置觸發器 觸發事件
END ## 結束
######################################## TRIGGER 觸發的SQL語句
$$ ## 語句結束
DELIMITER ; ## 語句結束符設回分號(;)
######################################################################CREATE-TRIGGER
######################################################################INSERT DATA
INSERT INTO `student`
(name,description)
VALUES
('HOUKE','KEKE');
######################################################################INSERT DATA
實施插入操作完成後,可發現,
除了輸入的sql語句生效外(student表中數據新增);
觸發器中執行的sql語句同樣生效了(user表中數據同步更新);