| 維度 | 觸發器 | 存儲過程 |
|---|---|---|
| 調用方式 | 事件自動觸發 | 显式 CALL/EXECUTE |
| 參數傳遞 | 無(通過 :NEW/:OLD 上下文) | IN/OUT/IN OUT 參數 |
| 事務控制 | 隸屬觸發語句事務 | 可獨立 COMMIT/ROLLBACK(自治事務除外) |
| 返回值 | 無 | 函數可返回值 |
CREATE [OR REPLACE] TRIGGER 觸發器名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE [OF 列名]} ON 表名
[FOR EACH ROW]
[WHEN (條件)]
DECLARE
-- 變量聲明(行級可選)
BEGIN
-- PL/SQL 塊
END;
BEFORE:語句/行執行前,可修改 :NEW 值,常用於驗證、賦值;AFTER:語句/行執行後,:NEW 已寫入,常用於審計、後續動作;FOR EACH ROW:行級,無則為語句級;WHEN:行級條件過濾,減少不必要觸發開銷。CREATE 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;
說明:語句級、BEFORE、攔截三種 DML,業務時間窗口控制經典模式。
PRAGMA AUTONOMOUS_TRANSACTION);:NEW/:OLD —— 編譯報錯;SELECT ... FROM 同表 —— ORA-04091 變異表錯誤;