INSTEAD OF 触发器的使用陷阱
来源:互联网 发布:js原型链的作用 编辑:程序博客网 时间:2024/05/17 01:25
对于两张表以上关联起来的视图,Oracle是分不出来应该对哪个表进行更新
而INSTEAD OF 触发器实现了我们对视图DML的需求,显示的告诉告诉Oracle要更新哪个表
和其他类型触发器不同的是,INSTEAD OF 触发器实际上并不是由某个事件触发的
因为对TRIGGER印象不太好,从未主动想去亲近她
这里Think想强调的一点是,9i的文档有提到:
"INSTEAD OF triggers defined in the view are dropped when a view is re-created"
一贯以来的思维方式就是:如果修改了底层对象,那么重新编译上层的视图、触发器、存储过程等即可
只要状态为 VALID 就视为没有问题
然而,INSTEAD OF 触发器却无异于当头棒喝,原来Oracle还会有这样的脾气!
下面用实验来证明这句话
注释:
触发器,而且是行级触发器
:OLD:指更新以前的字段值
:new:指更新以后的字段值
而INSTEAD OF 触发器实现了我们对视图DML的需求,显示的告诉告诉Oracle要更新哪个表
和其他类型触发器不同的是,INSTEAD OF 触发器实际上并不是由某个事件触发的
语法:
CREATE OR REPLACE TRIGGER trigger_nameINSTEAD OF operation --delete,update,insert,create and so onON view_nameFOR EACH ROWBEGIN ...END;
因为对TRIGGER印象不太好,从未主动想去亲近她
这里Think想强调的一点是,9i的文档有提到:
"INSTEAD OF triggers defined in the view are dropped when a view is re-created"
一贯以来的思维方式就是:如果修改了底层对象,那么重新编译上层的视图、触发器、存储过程等即可
只要状态为 VALID 就视为没有问题
然而,INSTEAD OF 触发器却无异于当头棒喝,原来Oracle还会有这样的脾气!
下面用实验来证明这句话
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.
注释:
触发器,而且是行级触发器
:OLD:指更新以前的字段值
:new:指更新以后的字段值
- INSTEAD OF 触发器的使用陷阱
- Oracle Instead of 触发器的使用
- 使用 Oracle Instead of 触发器
- instead of 触发器的用法
- instead of 触发器的用法
- instead of 触发器的用法
- 如何使用SQL Server INSTEAD-OF触发器
- 触发器 INSTEAD OF 和 AFTER 的区别
- 触发器的Instead of 与 After
- 设计 INSTEAD OF 触发器
- instead of触发器
- INSTEAD OF 触发器
- 设计 INSTEAD OF 触发器
- instead of触发器
- INSTEAD OF 触发器
- 关于 INSTEAD OF 触发器
- 关于 INSTEAD OF 触发器
- INSTEAD OF 触发器
- Maestro解析
- vs2005 c++ 出现 C:\Windows\System32\ntdll.dll”,未加载任何符号 ...........解决办法:
- 做事原则
- 解决超链接中文乱码
- C#核心概念--装箱和拆箱(什么是装箱和拆箱)
- INSTEAD OF 触发器的使用陷阱
- 阻止保存要求重新创建表的更改
- vc++ : 指定的模拟级别无效, 或所提供的模拟级别无效(win7) 原因解析
- python xlwt写excel格式控制
- C#(同步调用、异步调用、异步回调)
- java实现快速排序、插入排序、选择排序、冒泡排序算法
- MFC Picture Control显示图片
- InstallShield学习总结
- facebook会入华吗?