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

4019 Views

FacebookLinkedInTweet更新日期: 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 觸發器的運作方式,並在適當的情境下靈活運用!🚀

忍3编年史【持续更新】|忍者必须死3
有一个.py的文件如何在python运行