常識認為視圖是只讀的,但 Oracle 8i+ 支持單表視圖直接更新,多表視圖配合 INSTEAD OF 觸發器也能實現可更新。這對前台表單開發極其友好:前端視圖如同單表,後端觸發器封裝複雜的多表寫入邏輯。
CREATE TABLE t1 (t11 NUMBER(28), t12 VARCHAR2(20));
CREATE TABLE t2 (t11 NUMBER(28), t22 VARCHAR2(20));
CREATE OR REPLACE VIEW t AS
SELECT T1.t11 f1, T1.t12 f2, T2.t22 f3
FROM T1, T2 WHERE T1.t11 = T2.t11;
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;
:NEW/:OLD 伪記錄訪問新舊值若底表關聯非一對一,或主鍵不唯一,觸發器邏輯會極其複雜甚至無法正確實現。設計階段務必確保視圖行與底表行一一對應。