CodeGym /課程 /SQL SELF /認識 trigger

認識 trigger

SQL SELF
等級 57 , 課堂 0
開放

Trigger(或是 trigger)就像資料庫裡的「callback」,會對特定事件做出反應。換句話說,trigger 就是當你在 table 裡做 INSERTUPDATEDELETE 這些操作時,會自動執行某些動作的機制。

想像一下你有個超聰明的助理,每次你新增一筆學生資料時,他會自動幫你更新「最後修改日期」這個欄位。資料庫裡的 trigger 就是這樣:它會「監聽」事件,然後自動執行你設定好的反應。

Trigger 結合了兩個東西:

  1. 事件:table 裡發生了什麼事(例如插入一筆資料)。
  2. trigger function:當事件發生時要執行的程式碼。
重點:

trigger 一定要跟 function 綁在一起才有用。function 會決定 trigger 發生時要做什麼事。

trigger 的應用例子

來看看幾個 trigger 很實用的情境。

  1. 自動更新資料

你想讓學生資料的 table 裡有個 last_modified 欄位,每次資料被改動時自動更新。你不用每次都手動改這個欄位,只要設一個 trigger 就會自動幫你搞定。

  1. 變更紀錄(log)

你想追蹤是誰、什麼時候改了 table 裡的資料。trigger 可以在資料被改動時自動寫一筆紀錄到 audit(log)table 裡。

  1. 資料驗證

如果 table 裡的資料要符合某些規則(例如學生年齡必須大於 18 歲),trigger 可以在插入前先檢查資料。

  1. 自動計算

你有個 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 後自動處理。

2
任務
SQL SELF, 等級 57, 課堂 0
上鎖
變數類型的定義與日誌記錄
變數類型的定義與日誌記錄
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION