MySQL觸發器的做用及弊端

前言:    sql

        觸發器只是用在特定的場合,通常狀況下,咱們仍是在代碼中處理,由於同一個業務邏輯中,若是代碼和sql中都有業務邏輯,那麼後期維護將很麻煩,因此要根據實際狀況來選擇,看是否合適。觸發器就是寫在數據庫中的一個腳本sql,當數據庫某一個字段發生改變的時候,觸發一個或多條sql語句,同時讓多張表的數據同步。好比咱們有的表中存放了部門名稱,那麼當咱們部門名稱發生改變的時候,咱們應該調用觸發器同時去修改存放了「部門名稱」這個冗餘字段。數據庫

 

什麼是觸發器:

簡單的說,就是一張表發生了某件事(插入、刪除、更新操做),而後自動觸發了預先編寫好的若干條SQL語句的執行.安全

 

特色及做用:

特色:觸發事件的操做和觸發器裏的SQL語句是一個事務操做,具備原子性,要麼所有執行,要麼都不執行.spa

做用: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 會回滾

相關文章
相關標籤/搜索