SQL 觸發器(Triggers):自動執行的資料庫機制

更新日期: 2025 年 3 月 4 日

在 SQL 資料庫中,當我們對資料進行 新增(INSERT)、更新(UPDATE)、刪除(DELETE) 等操作時,通常需要執行一些額外的動作,例如:

  • 記錄變更歷史(Audit Log)
  • 自動計算某些欄位的值
  • 檢查或防止特定條件的變更

如果這些動作都手動處理,可能會增加錯誤發生的風險,並降低系統效率。這時候,SQL 觸發器(Triggers) 就能發揮作用!

SQL 觸發器是一種特殊的儲存程序,會在特定事件發生時自動執行。 本篇文章將帶你了解 SQL 觸發器的基本概念、語法、應用場景及最佳實踐,幫助你輕鬆掌握這個強大的資料庫工具。


什麼是 SQL 觸發器?

SQL 觸發器(Trigger) 是一種自動執行的 SQL 程式,當特定事件發生時,觸發器會被執行。例如:

  • 當一筆新資料被插入(INSERT)時,觸發器可以自動寫入紀錄表
  • 當某筆資料被修改(UPDATE)時,觸發器可以檢查數據是否符合規則
  • 當某筆資料被刪除(DELETE)時,觸發器可以防止重要資料被意外刪除

觸發器的執行不需要手動呼叫,它是由資料庫系統根據特定條件自動執行的。


SQL 觸發器的語法

SQL 觸發器的基本語法如下:

CREATE TRIGGER trigger_name
BEFORE | AFTER INSERT | UPDATE | DELETE
ON table_name
FOR EACH ROW
BEGIN
    -- 觸發器執行的 SQL 語句
END;

語法解析

  • CREATE TRIGGER trigger_name:定義一個觸發器名稱。
  • BEFOREAFTER
    • BEFORE(執行前):在 SQL 操作發生之前執行。
    • AFTER(執行後):在 SQL 操作發生之後執行。
  • INSERT | UPDATE | DELETE:指定觸發條件,表示觸發器在哪些操作時執行。
  • ON table_name:指定要監聽的資料表。
  • FOR EACH ROW:表示觸發器會針對每一筆變更的資料執行。
  • BEGIN ... END;:定義要執行的 SQL 語句。

SQL 觸發器的種類

觸發器主要根據執行時間點操作類型來分類:

觸發器類型說明
BEFORE INSERT在新資料被插入之前執行
AFTER INSERT在新資料被插入之後執行
BEFORE UPDATE在資料被更新之前執行
AFTER UPDATE在資料被更新之後執行
BEFORE DELETE在資料被刪除之前執行
AFTER DELETE在資料被刪除之後執行

不同的觸發器可用於不同的應用場景,例如:自動驗證數據、保護資料完整性、記錄數據變更等。


SQL 觸發器的應用範例

自動記錄數據變更(Audit Log)

有時,我們需要記錄表格的變更,以便日後查詢誰修改了什麼數據。這時,我們可以使用 AFTER INSERT 觸發器來記錄每次插入的操作。

範例:建立變更紀錄表

CREATE TABLE Employee_Audit (
    AuditID INT AUTO_INCREMENT PRIMARY KEY,
    EmployeeID INT,
    Name VARCHAR(50),
    ActionType VARCHAR(10),
    ChangeTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

建立 AFTER INSERT 觸發器

CREATE TRIGGER after_employee_insert
AFTER INSERT ON Employees
FOR EACH ROW
BEGIN
    INSERT INTO Employee_Audit (EmployeeID, Name, ActionType)
    VALUES (NEW.EmployeeID, NEW.Name, 'INSERT');
END;
  • Employees 表有新資料被插入時,Employee_Audit 會記錄這筆變更。

防止刪除重要數據

如果某些表中的資料不應該被刪除,例如 Users 表,我們可以建立 BEFORE DELETE 觸發器來防止資料被刪除。

建立 BEFORE DELETE 觸發器

CREATE TRIGGER before_user_delete
BEFORE DELETE ON Users
FOR EACH ROW
BEGIN
    SIGNAL SQLSTATE '45000' 
    SET MESSAGE_TEXT = '刪除操作被禁止!';
END;
  • 這個觸發器會阻止對 Users 表的刪除操作,並返回錯誤訊息。

自動計算總價格

在電商應用中,我們可能需要在新增訂單時,自動計算 TotalPrice,這可以透過 BEFORE INSERT 觸發器來完成。

建立 BEFORE INSERT 觸發器

CREATE TRIGGER before_order_insert
BEFORE INSERT ON Orders
FOR EACH ROW
BEGIN
    SET NEW.TotalPrice = NEW.Quantity * NEW.UnitPrice;
END;
  • 每當有新訂單被插入,系統會自動計算 TotalPrice = Quantity * UnitPrice

刪除 SQL 觸發器

如果需要移除一個已建立的觸發器,可以使用:

DROP TRIGGER trigger_name;

例如:

DROP TRIGGER before_user_delete;

這樣就能刪除 before_user_delete 這個觸發器。


SQL 觸發器的優勢與限制

✅ 優勢

  1. 自動化數據處理:減少手動執行的 SQL 查詢,提高開發效率。
  2. 增強數據完整性與安全性:可用於防止不合法的操作。
  3. 可用於記錄數據變更:有助於審計(Audit Log)與故障排除。

❌ 限制

  1. 可能影響效能:過多的觸發器可能會影響資料庫效能,因為它們會在每次操作時執行額外的 SQL 查詢。
  2. 調試困難:當多個觸發器同時影響數據時,可能會難以追蹤問題。
  3. 與應用層邏輯分離:在某些情況下,業務邏輯應該放在應用程式內,而不是資料庫觸發器內。

結語

SQL 觸發器是一種強大的工具,可以用來自動執行 SQL 操作,確保數據完整性、提高安全性,並簡化業務邏輯。

無論是記錄變更歷史、計算數據、還是防止錯誤操作,觸發器都能有效幫助我們管理資料庫。

然而,在使用觸發器時,也需要考慮效能與可維護性,以確保系統穩定運行。

希望這篇文章能幫助你理解 SQL 觸發器的運作方式,並在適當的情境下靈活運用!🚀

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *