前言:
觸發器隻是用在特定的場合,一般情況下,我們還是在代碼中處理,因為同一個業務邏輯中,如果代碼和sql中都有業務邏輯,那麼後期維護将很麻煩,所以要根據實際情況來選擇,看是否合适。觸發器就是寫在數據庫中的一個腳本sql,當數據庫某一個字段發生改變的時候,觸發一個或多條sql語句,同時讓多張表的數據同步。比如我們有的表中存放了部門名稱,那麼當我們部門名稱發生改變的時候,我們應該調用觸發器同時去修改存放了“部門名稱”這個冗餘字段。
什麼是觸發器:
簡單的說,就是一張表發生了某件事(插入、删除、更新操作),然後自動觸發了預先編寫好的若幹條SQL語句的執行.
特點及作用:特點:觸發事件的操作和觸發器裡的SQL語句是一個事務操作,具有原子性,要麼全部執行,要麼都不執行.
作用:1.安全性。可以基于數據庫的值使用戶具有操作數據庫的某種權利。 2.審計。可以跟蹤用戶對數據庫的操作。 3.實現複雜的非标準的數據庫相關完整性規則。觸發器可以對數據庫中相關的表進行連環更新。觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行數據更新的事務。當插入一個與其主健不匹配的外部鍵時,這種觸發器會起作用。 4.同步實時地複制表中的數據。 5.自動計算數據值,如果數據的值達到了一定的要求,則進行特定的處理。
弊端:1.增加程序的複雜度,有些業務邏輯在代碼中處理,有些業務邏輯用觸發器處理,會使後期維護變得困難.
2.如果需要變動整個數據集而數據集數據量又較大時,觸發器效果會非常低.
3.對于批量操作并不适合使用觸發器 使用觸發器實現的業務邏輯在出現問題時很難進行定位,特别是設計到多個觸發器的情況 協同開發時,寫業務層代碼如果不清楚數據庫 觸發器的細節,容易搞不清到底觸發了那些觸發器 大量使用觸發器會導緻代碼結構容易被打亂,閱讀源碼困難.
觸發器的創建:CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
trigger_name:用來表示觸發器的名稱,可以自己設計 trigger_time:标識觸發器的觸發時機,取值是BEFORE或AFTER trigger_event:标識觸發事件,取值為INSERT,UPDATE和DELETE tbl_name:标識建立觸發器的表名,即在哪張表上建立觸發器 trigger_stmt:觸發器程序體,可以是一句SQL語句,或者用 BEGIN 和 END 包含的多條語句。 由此可見,可以建立6種觸發器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。 不能在一個表中建兩個相同類型的觸發器,所以一個表最多隻能建6個觸發器;
查看觸發器:
SHOW TRIGGERS [FROM schema_name];
這裡的schema_name 就是指定的庫名
删除觸發器:DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
觸發器的修改:觸發器不能修改, 隻能删除以後重新創建.
觸發器的執行順序:我們建立的數據庫一般都是 InnoDB 數據庫,其上建立的表是事務性表,也就是事務安全的。這時,若SQL語句或觸發器執行失敗,MySQL 會回滾事務,有: ①如果 BEFORE 觸發器執行失敗,SQL 無法正确執行。 ②SQL 執行失敗時,AFTER 型觸發器不會觸發。 ③AFTER 類型的觸發器執行失敗,SQL 會回滾
,