# Ch04 觸發器Triggers https://loud-gosling-c3a.notion.site/b1c83675a42f41448886890dd5183e6b ## 1. 觸發器簡介 * <font color="#f00">**介紹**</font> : 在**事件發生**(對資料列做新增/修改/刪除)時,資料庫會**依照觸發條件**(事件前/事件後)**幫你執行預先儲存好的程式**。 > 常常有人利用觸發器來驗證資料的正確性 > 但是觸發器是非常昂貴的解決方案,它會耗用大量的系統資源 * <font color="#f00">**用途**</font> : 若希望當有人執行**任何修改**「cmdev.emp」表格資料的動作時,**都要被記錄下來**,以便日後檢核用,那麼可以設計一個「cmdev.emplog」表格,將異動記錄的訊息,新增到「cmdev.emplog」表格中。 >Triggers可以讓你先把一些在特定狀況要執行的敘述儲存起 來,MySQL資料庫會在正確的時機自動幫你執行這些敘述。 ## 2. 建立Triggers * 以下是建立trigger元件的語法 ```sql= CREATE TRIGGER 名稱 時機 事件 ON 表格名稱 FOR EACH ROW 敘述; ``` * 如果trigger元件執行的工作比較複雜,需要**一個以上的敘述時**,就要把敘述放在 **「BEGIN」與「END」區塊中**: ```SQL= CREATE TRIGGER 名稱 時機 事件 ON 表格名稱 FOR EACH ROW BEGIN 敘述... END; ``` * 依照需求,可以為一個表格建立不同的trigger元件 ![](https://i.imgur.com/lF0Yz7F.png) > 用需求案例來說明 > > 每一次修改「cmdev.emp」表格資料,都必須新增一筆紀錄到 「cmdev.emplog」表格中。 >> 為「cmdev.emp」表格建立一個「UPDATE TRIGGER」; >> 「BEFORE」與「AFTER」表示「之前」與「之後」 >> 以這個需求來說,「BEFORE」或「AFTER」都是一樣的 ![](https://i.imgur.com/ckoPJgC.png) :::warning Trigger 無法透過呼叫來執行, 而是由MySQL資料庫在適當的時機時,自動執行這些儲存在trigger中的敘述。 ::: * 建立trigger限制 1. 同一個資料庫不可以有相同名稱的Trigger 2. TEMPORARY表格與View不可以建立Trigger 3. 不可以使用「SELECT」敘述 4. 不可以使用「CALL」敘述 5. 不可以使用與交易(transactions)相關的敘述,包含 「START TRANSACTION」、「COMMIT」與 「ROLLBACK」 ## 3. 刪除TRIGGERS * 使用下列的語法刪除不再需要的trigger元件 ```SQL= DEOP TRIGGER [IF EXISTS] 名稱 ``` > 如果想要修改trigger元件中的敘述,**要先刪除以後,再建立新的trigger元件** ## 4. OLD 與 NEW關鍵字 MySQL資料庫在triggers元件中額外提供「OLD」與「NEW」兩個關鍵字: ![](https://i.imgur.com/7TPbRvL.png) * 因為「OLD」與「NEW」兩個關鍵字的特性,所以它們可以使用的triggers種類會有一些限制: ![](https://i.imgur.com/vmfA3cx.png) ![](https://i.imgur.com/x9dU65D.png) * 要完成上列的需求,就必須使用「OLD」與「NEW」關鍵字取得的欄位值:![](https://i.imgur.com/YZkmKsu.png) ![](https://i.imgur.com/QwVso5s.png) ## 查詢triggers的相關資訊 ![](https://i.imgur.com/CAvaHtE.png)