SQL 觸發器(Triggers):自動執行的資料庫機制
更新日期: 2025 年 3 月 4 日
本文為 SQL 關聯資料庫 基本介紹系列文,第 2 篇:
- 關聯式資料庫與資料完整性:初學者指南
- SQL 觸發器(Triggers):自動執行的資料庫機制 👈進度
- Django 信號(Signals) vs SQL 觸發器(Triggers):關係與差異解析
- 關聯式資料庫與交易(Transaction)機制入門
- 深入理解死結(Deadlock)與發生條件
- DCL(資料控制語言)入門:SQL 權限管理基礎
- SQL 儲存程序(Stored Procedure)入門
- ORM(對象關係對映):讓資料庫操作更簡單的工具
- SQL 儲存程序 vs ORM:如何選擇最適合的數據庫操作方式?
- 關聯式資料庫 View(檢視)是什麼?完整指南
- 理解 Materialized View:初學者指南
在 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
:定義一個觸發器名稱。BEFORE
或AFTER
: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 觸發器的優勢與限制
✅ 優勢
- 自動化數據處理:減少手動執行的 SQL 查詢,提高開發效率。
- 增強數據完整性與安全性:可用於防止不合法的操作。
- 可用於記錄數據變更:有助於審計(Audit Log)與故障排除。
❌ 限制
- 可能影響效能:過多的觸發器可能會影響資料庫效能,因為它們會在每次操作時執行額外的 SQL 查詢。
- 調試困難:當多個觸發器同時影響數據時,可能會難以追蹤問題。
- 與應用層邏輯分離:在某些情況下,業務邏輯應該放在應用程式內,而不是資料庫觸發器內。
結語
SQL 觸發器是一種強大的工具,可以用來自動執行 SQL 操作,確保數據完整性、提高安全性,並簡化業務邏輯。
無論是記錄變更歷史、計算數據、還是防止錯誤操作,觸發器都能有效幫助我們管理資料庫。
然而,在使用觸發器時,也需要考慮效能與可維護性,以確保系統穩定運行。
希望這篇文章能幫助你理解 SQL 觸發器的運作方式,並在適當的情境下靈活運用!🚀