首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

資料庫觸發器核心概念與 Oracle 實作詳解

     編輯:關於SqlServer

觸發器是特殊類型的預存程序,針對特定資料表的 INSERT、UPDATE、DELETE 操作自動觸發執行,提供比標準條件約束更精細、複雜的資料控制能力。

觸發器四大核心價值

領域典型應用場景
安全性基於資料值/時間/業務規則控制存取 (如:非上班時間禁止修改、股價漲幅限制 10%)
稽核記錄使用者操作語句、將異動寫入稽核表
資料完整性非標準檢查/條件約束、跨表級聯更新/刪除/設 NULL/設預設值、攔截破壞參考完整性的操作
業務自動化即時複寫、自動計算衍生值、閾值告警 (如帳戶餘額 < 5 萬發送通知)

Oracle 觸發器語法結構

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:列級觸發器中存取新/舊列值的偽記錄

實戰範例:禁止週末修改 auths 表

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 vs Sybase/SQL Server 差異提要

特性OracleSybase / SQL Server
觸發時機BEFORE / AFTERAFTER / INSTEAD OF
列級觸發器FOR EACH ROWFOR EACH ROW (隱含)
舊/新值存取:OLD / :NEWDELETED / INSERTED 虛擬表
多觸發器順序FOLLOWS / PRECEDES (11g+)sp_settriggerorder
INSTEAD OF僅限檢視檢視/資料表 (SQL Server 2000+)

設計原則與避坑指南

  1. 業務邏輯儘量放應用層,觸發器專注資料完整性/稽核/安全
  2. 避免巢狀/遞迴觸發:設定 RECURSIVE_TRIGGERS = OFF (SQL Server) 或謹慎設計
  3. 效能考量:觸發器在交易內執行,複雜邏輯會拉長鎖持有時間
  4. 除錯困難:建立完善的稽核日誌,記錄觸發器執行軌跡
  5. 文件化:在資料字典/資料模型工具中標註觸發器用途與觸發條件

善用觸發器能在資料庫層面建立堅固的資料防線,但濫用會導致系統脆弱難維護,請遵循「最小必要、職責單一、可觀測」原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved