觸發器是特殊類型的預存程序,針對特定資料表的 INSERT、UPDATE、DELETE 操作自動觸發執行,提供比標準條件約束更精細、複雜的資料控制能力。
| 領域 | 典型應用場景 |
|---|---|
| 安全性 | 基於資料值/時間/業務規則控制存取 (如:非上班時間禁止修改、股價漲幅限制 10%) |
| 稽核 | 記錄使用者操作語句、將異動寫入稽核表 |
| 資料完整性 | 非標準檢查/條件約束、跨表級聯更新/刪除/設 NULL/設預設值、攔截破壞參考完整性的操作 |
| 業務自動化 | 即時複寫、自動計算衍生值、閾值告警 (如帳戶餘額 < 5 萬發送通知) |
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER}
{INSERT | UPDATE | DELETE [OF column_list]}
ON table_name
[FOR EACH ROW]
[WHEN (condition)]
DECLARE
-- 宣告區 (可選)
BEGIN
-- PL/SQL 區塊
EXCEPTION
-- 例外處理 (可選)
END;
BEFORE / AFTER:觸發時機。BEFORE 可用於驗證/修改新值 (:NEW);AFTER 適用於稽核/級聯操作FOR EACH ROW:列級觸發器,每影響一列執行一次;省略則為 陳述式級觸發器,整個語句僅執行一次WHEN (condition):額外過濾條件,僅滿足條件時觸發:NEW / :OLD:列級觸發器中存取新/舊列值的偽記錄CREATE OR REPLACE TRIGGER auth_secure
BEFORE INSERT OR UPDATE OR DELETE ON auths
BEGIN
IF TO_CHAR(SYSDATE, 'DY') IN ('SAT', 'SUN') THEN
RAISE_APPLICATION_ERROR(-20600, '週末禁止修改 auths 表');
END IF;
END;
/
-- 注意:此為陳述式級觸發器,無 FOR EACH ROW,整張表操作僅檢查一次
CREATE OR REPLACE TRIGGER cascade_delete_books
AFTER DELETE ON authors
FOR EACH ROW
BEGIN
DELETE FROM books WHERE author_code = :OLD.author_code;
END;
/
-- 刪除作者時自動刪除其所有書籍記錄
| 特性 | Oracle | Sybase / SQL Server |
|---|---|---|
| 觸發時機 | BEFORE / AFTER | AFTER / INSTEAD OF |
| 列級觸發器 | FOR EACH ROW | FOR EACH ROW (隱含) |
| 舊/新值存取 | :OLD / :NEW | DELETED / INSERTED 虛擬表 |
| 多觸發器順序 | FOLLOWS / PRECEDES (11g+) | sp_settriggerorder |
| INSTEAD OF | 僅限檢視 | 檢視/資料表 (SQL Server 2000+) |
RECURSIVE_TRIGGERS = OFF (SQL Server) 或謹慎設計善用觸發器能在資料庫層面建立堅固的資料防線,但濫用會導致系統脆弱難維護,請遵循「最小必要、職責單一、可觀測」原則。