在開發大型管理信息系統(MIS)時,我們常面臨數據冗餘維護、批量刪除處理以及動態信息同步等挑戰。採用 PowerBuilder 作為前端、Oracle 作為後端數據庫的架構下,數據庫觸發器憑藉其「事件驅動、自動執行」的特性,成為解決這類問題的利器。本文結合實際開發經驗,系統梳理觸發器的核心概念、類型及執行順序,並通過「冗餘數據同步」與「跨庫數據復制」兩個典型場景,展示觸發器在 MIS 開發中的最佳實踐。
數據庫觸發器是針對 INSERT、UPDATE、DELETE 等 DML 事件自動執行的存儲程序。它能實現複雜的完整性約束、審計追蹤、異構系統同步等業務邏輯,且對應用層透明。
BEFORE 與 AFTER。BEFORE / AFTER;可通過 :NEW、:OLD 訪問新舊值。專用於視圖,將對視圖的 DML 操作轉向底層基表,實現不可更新視圖的「可更新性」。
綜合時機、粒度、事件,共形成 14 種觸發器。單條 DML 執行時的觸發順序如下:
BEFORE 觸發器BEFORE 觸發器AFTER 觸發器AFTER 觸發器關鍵點:若需在插入時自動賦值某列(如序列號),必須使用 BEFORE INSERT 行級觸發器,因 AFTER INSERT 時 :NEW 已不可修改。
為提升報表查詢效能,數據模型常引入冗餘字段。例如「訂單表」冗餘存儲「客戶名、地址」,避免頻繁關聯查詢。但當客戶基表變更時,必須同步更新所有關聯訂單的冗餘列,否則會導致數據不一致。
CREATE OR REPLACE TRIGGER trg_customer_sync_order
BEFORE UPDATE ON customer
FOR EACH ROW
BEGIN
UPDATE orders
SET cu_no = :NEW.cu_no,
cu_name = :NEW.cu_name,
cu_addr = :NEW.cu_address
WHERE cu_no = :OLD.cu_no;
END;
/
採用 BEFORE UPDATE ... FOR EACH ROW,在事務提交前完成級聯,確保「讀取即一致」,且不增加應用層代碼複雜度。
當僅需「插入即同步」的單向復制需求時,可結合 Database Link 与 AFTER INSERT 行級觸發器,實現低成本異構同步。
CREATE DATABASE LINK remote_db
CONNECT TO remote_user IDENTIFIED BY pwd
USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.100)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))';
CREATE OR REPLACE TRIGGER trg_sync_remote
AFTER INSERT ON local_table
FOR EACH ROW
BEGIN
INSERT INTO remote_table@remote_db (col1, col2, col3)
VALUES (:NEW.col1, :NEW.col2, :NEW.col3);
END;
/
適用邊界:數據量較小、網絡延遲可接受、無雙向寫入衝突的場景。大規模或高頻同步建議採用 GoldenGate、XStreams 等專業複製技術。
FOLLOWS/PRECEDES 子句(11g+)顯式控制順序。合理運用觸發器,能讓 MIS 系統在數據一致性、審計追蹤、輕量同步等方面事半功倍,是 Oracle 開發者必備的進階技能。