1.什麼是觸發器
觸發器是一種特殊的存儲過程,它在插入,删除或修改特定表中的資料時觸發執行
它比資料庫本身标準的功能有更精細和更複雜的資料控制能力
2.觸發器的作用:
2.1 安全性
可以基于資料庫的值使使用者具有操作資料庫的某種權利。
可以基于時間限制使用者的操作,例如不允許下班後和節假日修改資料庫資料
可以基于資料庫中的資料限制使用者的操作,例如不允許股票的價格的升幅一次超過10%
2.2 審計
可以跟蹤使用者對資料庫的操作
審計使用者操作資料庫的語句
把使用者對資料庫的操作寫入審計表
2.3 實作複雜的資料完整性規則
實作非标準的資料完整性檢查和限制。觸發器可産生比規則更為複雜的限制。與規則不同,觸發器可以引用列或資料庫對象。
例如,觸發器可回退任何企圖吃進超過自己保證金的期貨。
2.4 實作複雜的非标準的資料庫相關完整性規則。
觸發器可以對資料庫中相關的表進行連環更新。
例如,在auths表author_code列上的删除觸發器可導緻相應删除在其它表中的與之比對的行。
觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行資料更新的事務
2.5 實時同步地複制表中的資料
2.6 自動計算資料值
如果資料的值達到了一定的要求,則進行特定的處理。
例如,如果公司的帳号上的資金低于5萬元則立即給财務人員發送警告資料
3.建立觸發器:
文法:
create trigger 觸發器名稱 觸發的時機 觸發的動作 on 表名 for each row 觸發器狀态。
參數說明:
觸發器名稱: 自己定義
觸發的時機: before /after表示在執行動作之前還是之後觸發操作
觸發的動作 :指的激發觸發程式的語句類型<insert ,update,delete>
觸發器建立文法四要素:
1.監視地點(table)
2.監視事件(insert/update/delete)
3.觸發時間(after/before)
例子:當category表中,删除一個bTypeid=3的圖書分類時,books表中也要删除對應分類的圖書資訊
mysql> use book;
在category執行删除前,檢視bTypeId=3的圖書分類:
mysql> select bName,bTypeId from books where bTypeId=3;
建立觸發
mysql> delimiter //
mysql> create trigger delCategory after delete on category for each row
-> delete from books where bTypeId=3;
-> //
删除bTypeId=3的記錄
mysql> delete from category where bTypeId=3;
檢視:是否還有bTypeId=3的圖書記錄。可以看出已經删除。
MariaDB [book]> select bName,bTypeId from books where bTypeId=3; # 查詢books表中bTypeId為3的記錄
+--------------------------------------+---------+
| bName | bTypeId |
+--------------------------------------+---------+
| 3D MAX 3.0 創作效果百例 | 3 |
| 3DS MAX 4橫空出世 | 3 |
| 3D MAX R3動畫制作與教育訓練教程 | 3 |
| 3D Studio Max 3綜合使用 | 3 |
+--------------------------------------+---------+
4 rows in set (0.00 sec)
MariaDB [book]> delimiter //
MariaDB [book]> create trigger del_category after delete on category for each row # 建立觸發器,當從category中删除記錄中觸發
-> delete from books where bTypeId=3; # 觸發後的操作:從books表中删除bTypeId為3的記錄
-> //
Query OK, 0 rows affected (0.02 sec)
MariaDB [book]> delete from category where bTypeId = 3// # 在category表中删除bTypeId為3的記錄
Query OK, 1 row affected (0.01 sec)
MariaDB [book]> select * from category where bTypeId =3// # 查詢category表中bTypeId為3的記錄
Empty set (0.01 sec)
MariaDB [book]> select * from books where bTypeId =3// # 查詢books表中bTypeId為3的記錄
Empty set (0.00 sec)
4.檢視觸發器:
4.1 檢視建立過程
show create trigger 觸發器名字\G
例子:
MariaDB [book]> show create trigger del_category\G # 檢視前面建立的觸發器del_category
*************************** 1. row ***************************
Trigger: del_category
sql_mode:
SQL Original Statement: CREATE DEFINER=`root`@`localhost` trigger del_category after delete on category for each row
delete from books where bTypeId=3
character_set_client: utf8
collation_connection: utf8_unicode_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
4.2 檢視觸發器詳細資訊
show triggers\G # 檢視所有的觸發器
MariaDB [book]> show triggers \G
*************************** 1. row ***************************
Trigger: del_category
Event: DELETE
Table: category
Statement: delete from books where bTypeId=3
Timing: AFTER
Created: NULL
sql_mode:
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_unicode_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
5.删除觸發器:
drop trigger 觸發器名稱;
MariaDB [book]> delimiter;
MariaDB [book]> drop trigger del_category;
Query OK, 0 rows affected (0.00 sec)
MariaDB [book]> delimiter;