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

多表關聯 Oracle View 不可更新?INSTEAD OF Trigger 解決之道

     編輯:Oracle 資料庫基礎

問題背景

單表 View 可直接 DML;但跨多表(JOIN)建立的 View 預設不可插入/更新/刪除,嘗試會報 ORA-01779: cannot modify a column which maps to a non key-preserved table。

解決方案:INSTEAD OF Trigger

在 View 上建立 INSTEAD OF 觸發器,攔截 DML 並轉發至基底表:

CREATE OR REPLACE TRIGGER trg_v_multi_io
INSTEAD OF INSERT OR UPDATE OR DELETE ON v_multi
FOR EACH ROW
DECLARE
BEGIN
  IF INSERTING THEN
    INSERT INTO base_tbl1 (col1, col2) VALUES (:NEW.f1, :NEW.f2);
    INSERT INTO base_tbl2 (col1, col3) VALUES (:NEW.f1, :NEW.f3);
  ELSIF UPDATING THEN
    UPDATE base_tbl1 SET col1 = :NEW.f1, col2 = :NEW.f2 WHERE col1 = :OLD.f1;
    UPDATE base_tbl2 SET col1 = :NEW.f1, col3 = :NEW.f3 WHERE col1 = :OLD.f1;
  ELSIF DELETING THEN
    DELETE FROM base_tbl1 WHERE col1 = :OLD.f1;
    DELETE FROM base_tbl2 WHERE col1 = :OLD.f1;
  END IF;
END;
/

關鍵點

  • :NEW 代表新值,:OLD 代表舊值。
  • 觸發器必須處理所有三種 DML 情境,否則對應操作仍會失敗。
  • 複雜 JOIN(外部聯結、聚合)可能無法完整對應,需評估業務邏輯是否允許。
  • 效能:觸發器逐列執行,大量資料建議改用存儲過程批次處理。

結語

INSTEAD OF TRIGGER 是多表 View 可更新化的標準手段,將「視圖邏輯」與「基底表寫入邏輯」解耦,符合封裝原則。生產環境務必配合單元測試驗證各 DML 情境。

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