Trigger(或是 trigger)就像資料庫裡的「callback」,會對特定事件做出反應。換句話說,trigger 就是當你在 table 裡做 INSERT、UPDATE 或 DELETE 這些操作時,會自動執行某些動作的機制。
想像一下你有個超聰明的助理,每次你新增一筆學生資料時,他會自動幫你更新「最後修改日期」這個欄位。資料庫裡的 trigger 就是這樣:它會「監聽」事件,然後自動執行你設定好的反應。
Trigger 結合了兩個東西:
- 事件:table 裡發生了什麼事(例如插入一筆資料)。
- trigger function:當事件發生時要執行的程式碼。
trigger 一定要跟 function 綁在一起才有用。function 會決定 trigger 發生時要做什麼事。
trigger 的應用例子
來看看幾個 trigger 很實用的情境。
- 自動更新資料
你想讓學生資料的 table 裡有個 last_modified 欄位,每次資料被改動時自動更新。你不用每次都手動改這個欄位,只要設一個 trigger 就會自動幫你搞定。
- 變更紀錄(log)
你想追蹤是誰、什麼時候改了 table 裡的資料。trigger 可以在資料被改動時自動寫一筆紀錄到 audit(log)table 裡。
- 資料驗證
如果 table 裡的資料要符合某些規則(例如學生年齡必須大於 18 歲),trigger 可以在插入前先檢查資料。
- 自動計算
你有個 orders table 存訂單,每次新增訂單時要更新客戶的總消費金額。這種事不用手動做,trigger 可以自動幫你算好。
什麼時候該用 trigger
現在知道 trigger 能幹嘛了,來聊聊什麼時候真的該用 trigger。
log 跟 audit:trigger 超適合拿來做 audit log,追蹤重要 table 的變動。
維護資料完整性:比如你從資料庫刪掉一門課,trigger 可以自動把跟這門課有關的學生也刪掉,避免留下「孤兒」資料。
自動化重複性工作:像是自動更新計算值、彙總資料等等。
把 business logic 寫在 DB 裡:有些邏輯不用全都寫在 app 裡,可以直接搬到資料庫層。
trigger 的優點
你大概已經發現 trigger 很強大,來看看它有什麼好處:
自動化:幾乎不用人手動操作。像是誰改了資料都會自動被記錄下來。
減少重複程式碼:不用每個 app 都寫一遍驗證或更新邏輯,直接寫在 DB 裡就好。
確保資料正確:trigger 可以當作多一層保護,讓資料永遠是對的。
trigger 的缺點
當然,trigger 也不是萬能的,來看看它的黑暗面:
debug 很麻煩:trigger 都在「幕後」運作,如果沒照你預期的跑,debug 會很頭痛。
可能拖慢效能:trigger 太複雜或被叫太多次,SQL 查詢就會變慢。
邏輯藏太深:business logic 都藏在 trigger 裡,開發者很難搞懂資料庫到底在幹嘛。
實際應用場景
例子 1:變更紀錄(log)
假設你有個 students table 存學生資料,想追蹤資料的變動。這時 trigger 就可以在學生資料被改動時,自動寫一筆紀錄到 audit_log table。
例子 2:自動更新
students table 裡有個 last_modified 欄位,你希望每次學生資料被改動時這個欄位都會自動更新。這可以用 trigger 在 update 後自動處理。
GO TO FULL VERSION