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

Oracle 多表可更新視圖實戰:INSTEAD OF 觸發器讓視圖像表一樣增刪改

     編輯:關於SqlServer

常識認為視圖是只讀的,但 Oracle 8i+ 支持單表視圖直接更新,多表視圖配合 INSTEAD OF 觸發器也能實現可更新。這對前台表單開發極其友好:前端視圖如同單表,後端觸發器封裝複雜的多表寫入邏輯。

適用場景

  • 業務表單需同時維護主表與從表(如銷售單頭/身、出入庫單)
  • 前台希望像操作單表一樣操作關聯數據
  • 避免前端編寫複雜的多表事務代碼

實現三步走

1. 創建測試表

CREATE TABLE t1 (t11 NUMBER(28), t12 VARCHAR2(20));
CREATE TABLE t2 (t11 NUMBER(28), t22 VARCHAR2(20));

2. 創建多表視圖

CREATE OR REPLACE VIEW t AS
SELECT T1.t11 f1, T1.t12 f2, T2.t22 f3
FROM T1, T2 WHERE T1.t11 = T2.t11;

3. 創建 INSTEAD OF 觸發器

CREATE OR REPLACE TRIGGER Trg_InsUpdDel_t
INSTEAD OF INSERT OR UPDATE OR DELETE ON t
FOR EACH ROW
BEGIN
  IF INSERTING THEN
    INSERT INTO t1 (t11, t12) VALUES (:NEW.f1, :NEW.f2);
    INSERT INTO t2 (t11, t22) VALUES (:NEW.f1, :NEW.f3);
  ELSIF UPDATING THEN
    UPDATE t1 SET t11 = :NEW.f1, t12 = :NEW.f2 WHERE t11 = :OLD.f1;
    UPDATE t2 SET t11 = :NEW.f1, t22 = :NEW.f3 WHERE t11 = :OLD.f1;
  ELSIF DELETING THEN
    DELETE FROM t1 WHERE t11 = :OLD.f1;
    DELETE FROM t2 WHERE t11 = :OLD.f1;
  END IF;
END;

關鍵點總結

  • 視圖列名(f1,f2,f3)映射到底表列
  • 觸發器中使用 :NEW/:OLD 伪記錄訪問新舊值
  • 必須處理 INSERT/UPDATE/DELETE 三種操作
  • 主鍵唯一性是多表視圖可更新的前提(此處 t11 為關聯鍵)

避坑指南

若底表關聯非一對一,或主鍵不唯一,觸發器邏輯會極其複雜甚至無法正確實現。設計階段務必確保視圖行與底表行一一對應。

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