INSTEAD OF 触发器的使用陷阱
对于两张表以上关联起来的视图,Oracle是分不出来应该对哪个表进行更新
而INSTEAD OF 触发器实现了我们对视图DML的需求,显示的告诉告诉Oracle要更新哪个表
和其他类型触发器不同的是,INSTEAD OF 触发器实际上并不是由某个事件触发的
语法:
hr@ORCL> CREATE TABLE A (ID NUMBER(5),COL VARCHAR2(5));Table created.hr@ORCL> CREATE TABLE B (ID NUMBER(5),COL VARCHAR2(5));Table created.hr@ORCL> CREATE OR REPLACE VIEW V_AB AS 2 SELECT A.ID,A.COL AS COLA,B.COL AS COLB 3 FROM A,B 4 WHERE A.ID=B.ID 5 /View created.hr@ORCL> CREATE OR REPLACE TRIGGER TRG_V_AB 2 INSTEAD OF INSERT ON V_AB 3 FOR EACH ROW 4 BEGIN 5 INSERT INTO A(ID,COL)VALUES(:NEW.ID,:NEW.COLA); 6 INSERT INTO B(ID,COL)VALUES(:NEW.ID,:NEW.COLB); 7 END; 8 /Trigger created.hr@ORCL> SELECT TRIGGER_NAME,TRIGGER_TYPE FROM USER_TRIGGERS;TRIGGER_NAME TRIGGER_TYPE------------------------------ ----------------TRG_V_AB INSTEAD OF hr@ORCL> INSERT INTO V_AB VALUES(1,'AA','BB');1 row created.hr@ORCL> COMMIT;Commit complete.hr@ORCL> select * from a; ID COL---------- ----- 1 AAhr@ORCL> select * from b; ID COL---------- ----- 1 BBhr@ORCL> CREATE OR REPLACE VIEW V_AB AS 2 SELECT A.ID,B.COL AS COLA,A.COL AS COLB 3 FROM A,B 4 WHERE A.ID=B.ID 5 /View created.hr@ORCL> INSERT INTO V_AB VALUES(1,'AA','BB');INSERT INTO V_AB VALUES(1,'AA','BB')*ERROR at line 1:ORA-01779: cannot modify a column which maps to a non key-preserved tablehr@ORCL> SELECT TRIGGER_NAME,TRIGGER_TYPE FROM USER_TRIGGERS;no rows selected.