1. 程式人生 > 資料庫 >mysql觸發器簡介、建立觸發器及使用限制分析

mysql觸發器簡介、建立觸發器及使用限制分析

本文例項講述了mysql觸發器簡介、建立觸發器及使用限制。分享給大家供大家參考,具體如下:

簡介

SQL觸發器是儲存在資料庫目錄中的一組SQL語句。每當與表相關聯的事件發生時,即會執行或觸發SQL觸發器,例如插入,更新或刪除。SQL觸發器也可以當做是一種特殊型別的儲存過程。 它是特別的,因為它不像直接像儲存過程那樣呼叫。 觸發器和儲存過程之間的主要區別在於,當對錶執行資料修改事件時,會自動呼叫觸發器,而儲存過程必須要明確地呼叫。

完事我們來看下SQL觸發器的優點:

  • SQL觸發器提供了檢查資料完整性的替代方法。
  • SQL觸發器可以捕獲資料庫層中業務邏輯中的錯誤。
  • SQL觸發器提供了執行計劃任務的另一種方法。通過使用SQL觸發器,您不必等待執行計劃的任務,因為在對錶中的資料進行更改之前或之後自動呼叫觸發器。
  • SQL觸發器對於稽核表中資料的更改非常有用。

再來看下它的缺點:

  • SQL觸發器只能提供擴充套件驗證,並且無法替換所有驗證。一些簡單的驗證必須在應用層完成。 例如,您可以使用JavaScript或伺服器端使用伺服器端指令碼語言(如JSP,PHP,ASP.NET,Perl等)來驗證客戶端的使用者輸入。
  • 從客戶端應用程式呼叫和執行SQL觸發器不可見,因此很難弄清資料庫層中發生的情況。
  • SQL觸發器可能會增加資料庫伺服器的開銷。

既然觸發器都是一種特殊的儲存過程了,那麼我們在它們中間該如何取捨呢?在下只是建議下,如果我們無法使用儲存過程完成工作時,可以考慮使用下SQL觸發器。

建立觸發器

在MySQL中,觸發器是一組SQL語句,當對相關聯的表上的資料進行更改時,會自動呼叫該語句。 觸發器可以被定義為在insert,update或delete語句更改資料之前或之後呼叫。在MySQL5.7.2版本之前,每個表最多可以定義六個觸發器。我們來看下它們的簡單介紹:

  • BEFORE INSERT - 在資料插入表之前被啟用觸發器。
  • AFTER INSERT - 在將資料插入表之後啟用觸發器。
  • BEFORE UPDATE - 在表中的資料更新之前啟用觸發器。
  • AFTER UPDATE - 在表中的資料更新之後啟用觸發器。
  • BEFORE DELETE - 在從表中刪除資料之前啟用觸發器。
  • AFTER DELETE - 從表中刪除資料之後啟用觸發器。

但是,從MySQL 5.7.2+版本開始,可以為相同的觸發事件和動作時間定義多個觸發器。當使用不使用INSERT,DELETE或UPDATE語句更改表中資料的語句時,不會呼叫與表關聯的觸發器。 例如,truncate語句刪除表的所有資料,但不呼叫與該表相關聯的觸發器。但是,有些語句使用了後臺的INSERT語句,如REPLACE語句或LOAD DATA語句。如果使用這些語句,則呼叫與表關聯的相應觸發器。所以我們必須要為與表相關聯的每個觸發器使用唯一的名稱。可以為不同的表定義相同的觸發器名稱,這是一個很好的做法。我們來看下定義觸發器的語法結構:

(BEFORE | AFTER)_tableName_(INSERT| UPDATE | DELETE)

例如,before_order_update是更新orders表中的行資料之前呼叫的觸發器。我們再來看一種定義方式:

tablename_(BEFORE | AFTER)_(INSERT| UPDATE | DELETE)

例如,order_before_update與上述before_order_update觸發器相同。

mysql會在在資料目錄中儲存觸發器,例如:/data/luyaran/,並使用名為tablename.TRG和triggername.TRN的檔案:

  • tablename.TRG檔案將觸發器對映到相應的表。
  • triggername.TRN檔案包含觸發器定義。

所以我們可以通過將觸發器檔案複製到備份資料夾來備份mysql觸發器,還可以使用mysqldump工具備份觸發器。

使用限制

mysql觸發器覆蓋標準SQL中定義的所有功能,但是,在應用程式中使用它們也會有一些限制:

  • 使用在SHOW,LOAD DATA,LOAD TABLE,BACKUP DATABASE,RESTORE,FLUSH和RETURN語句之上。
  • 使用隱式或明確提交或回滾的語句,如COMMIT,ROLLBACK,START TRANSACTION,LOCK/UNLOCK TABLES,ALTER,CREATE,DROP,RENAME等。
  • 使用準備語句,如PREPARE,EXECUTE等
  • 使用動態SQL語句。

好啦,本次記錄就到這裡了。

更多關於MySQL相關內容感興趣的讀者可檢視本站專題:《MySQL查詢技巧大全》、《MySQL事務操作技巧彙總》、《MySQL儲存過程技巧大全》、《MySQL資料庫鎖相關技巧彙總》及《MySQL常用函式大彙總》

希望本文所述對大家MySQL資料庫計有所幫助。