天天看點

詳解MariaDB資料庫的觸發器

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;           

繼續閱讀