[精选]oracleDML触发器

上传人:我**** 文档编号:183794512 上传时间:2021-06-15 格式:PPTX 页数:37 大小:676.32KB
返回 下载 相关 举报
[精选]oracleDML触发器_第1页
第1页 / 共37页
[精选]oracleDML触发器_第2页
第2页 / 共37页
[精选]oracleDML触发器_第3页
第3页 / 共37页
[精选]oracleDML触发器_第4页
第4页 / 共37页
[精选]oracleDML触发器_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《[精选]oracleDML触发器》由会员分享,可在线阅读,更多相关《[精选]oracleDML触发器(37页珍藏版)》请在金锄头文库上搜索。

1、1,主讲人:毛应爽,第10章 触发器,第10章 触发器,2,第10章 触发器,10.1 触发器概述 10.2 DML触发器 10.3 替代触发器 10.4 系统触发器 10.5 用户事件触发器 10.6 管理触发器,3,1、概念 触发器是在事件发生时隐式地自动运行的PL/SQL程序块,不能接收参数,不能被调用。 2、触发器的构成 触发器名称 触发器的触发事件 触发器限制条件 触发器主体,10.1 触发器概述,4,3、创建触发器的语法格式 CREATE OR REPLACE TRIGGER trigger_name -触发器的触发事件 BEFORE | AFTER | INSTEAD OF tr

2、iggering_event WHEN trigger_condition -限制条件 FOR EACH ROW -行级触发 trigger_body; -语句体,10.1 触发器概述,5,说明: trigger_name是触发器的名称, triggering_event说明了激发触发器的事件(也可能包括特殊的表或视图), trigger_body是触发器的代码。 注意:如果在WHEN子句中指定trigger_condition的话,则首先对该条件求值。触发器主体只有在该条件为真值时才运行。,10.1 触发器概述,6,第10章 触发器,10.1 触发器概述 10.2 DML触发器 10.3 替

3、代触发器 10.4 系统事件触发器 10.5 用户事件触发器 10.6 管理触发器,7,10.2 DML触发器,DML触发器是针对某个表进行DML操作时触发的。 语法格式: CREATE OR REPLACE TRIGGER trigger_name BEFORE | AFTER | INSERT|DELETE|UPDATEOF column,column ON table_name|view_name REFERENCING OLD ASold_name|NEW AS new_name FOR EACH ROW WHEN trigger_condition trigger_body;,8,在

4、编写触发器源代码之前,必须先确定其触发时间、触发事件及触发器的类型。,DML 触发器类型,行级触发器,语句级触发器,DML 触发器 触发事件,表更新,表插入,表删除,DML触发器 触发时间(时机),BEFORE,AFTER,10.2 DML触发器,9,触发事件 (如INSERT、UPDATE、DELETE等),触发器脚本,触发时机 BEFORE (事件),触发对象表,BEFORE触发器,10,触发器事件(如INSERT、UPDATE、DELETE等),触发器脚本,触发时机 AFTER (事件),触发对象表,AFTER触发器,11,语句级触发器与行级触发器的区别:,触发器脚本(1次),语句级,触

5、发器脚本,行级,行级,行级,触发器脚本,触发器脚本 (n次),10.2 DML触发器,12,10.2 DML触发器,1、语句级触发器 语句级触发器在每个数据修改语句执行后只调用一次,而不管这一操作将影响到多少行。 例1:创建一个orderdetails_tablelog表并建立一个AFTER触发器,用于记录是哪些用户删除了orderdetails表中的数据及删除的时间。 CREATE TABLE orderdetails_tablelog (who varchar2(40), oper_date date, operate varchar2(100);,13,10.2 DML触发器,CREAT

6、E OR REPLACE TRIGGER dele_orderdetails AFTER delete ON orderdetails BEGIN INSERT INTO orderdetails_tablelog VALUES(user,sysdate,delete); END; 注:在该触发器被触发后,尽管一次删除多条记录,但触发器只执行一次插入操作。,查看触发器的定义文本使用数据字典user_source,14,10.2 DML触发器,2、行级触发器 行级触发器是按触发语句所处理的行激发的,可以引用受到影响的行值。创建触发器时采用关键字FOR EACH ROW 这种访问是通过两个相关的标

7、识符实现的 :old :用于存放未进行修改前的数据。 :new :用于存放进行修改后的数据。,15,10.2 DML触发器,例2:创建一个orderdetails_Rowlog表并建立一个AFTER触发器,用于记录是哪些用户删除了在什么时间删除了orderdetails表中的哪些行数据。 CREATE TABLE orderdetails_rowLog1 (who varchar2(40), oper_date timestamp, operate varchar2(100), orderid number, productid number);,16,10.2 DML触发器,CREATE O

8、R REPLACE TRIGGER deleRow_orderdetails AFTER delete ON orderdetails FOR EACH ROW BEGIN INSERT INTO orderdetails_rowLog VALUES(user,sysdate,delete,:old.orderid, :old.productid); END;,17,10.2 DML触发器,例3:创建一个BEFORE触发器,使得在向ORDERS表中插入记录之前对ShippedDate字段进行检测,要求其值不允许为周六或周日,发货时间应在8-18点之间。否则将提示错误发货时间应为工作时间。,18

9、,10.2 DML触发器,CREATE OR REPLACE TRIGGER secure_shippeddate BEFORE INSERT ON orders For each row BEGIN IF (TO_CHAR(:new.shippeddate,DY) in (SAT,SUN)OR (to_number(TO_CHAR(:new.shippeddate,HH24) NOT BETWEEN 8 AND 18) THEN RAISE_APPLICATION_ERROR(-20500,发货时间应为工作时间); END IF; END;,19,使用“:old”和“:new”应注意: 在B

10、EFORE类型行级触发器和AFTER类型行级触发器中使用这些标识符。 在语句级触发器中不要使用这些标识符。 在PL/SQL语句或SQL语句中,这些标识符前加上冒号(:)来引用它们。 在行级触发器的WHEN条件中使用该标识符时,前面不要加冒号(:). 在BEFORE触发器中不能修改“:old”,在AFTER触发器中不能修改“:new”,10.2 DML触发器,20,触发时机BEFORE后, :new的值还没有被插入到表里, 因此:new可以修改,而此时, :old值是表中没有被修改的值,因此不能被修改,触发器脚本,触发时机 BEFORE (事件),触发对象表,:new,:old,21,触发器事件

11、(如INSERT、UPDATE、DELETE等),触发器脚本,:new,:old,触发时机AFTER后, :new的值已经被插入到表里, 因此:new不能修改,触发时机 AFTER (事件),22,10.2 DML触发器,例句4:用触发器实现在用户添加数据时,使用序列生成的数字,为表的主键提供自动编号的键值。 -创建表 CREATE TABLE temp_table (temp_id number,name varchar2(30); -创建序列 CREATE SEQUENCE incrID START WITH 10 INCREMENT BY 5 NOMAXVALUE CACHE 10;,2

12、3,10.2 DML触发器,-创建触发器以提供自动编号的键值 CREATE OR REPLACE TRIGGER incr_trigger BEFORE INSERT ON temp_table FOR EACH ROW DECLARE next_no number; BEGIN SELECT incrID.nextval INTO next_no FROM DUAL; :new.temp_id:= next_no; END;,24,当一个触发器中的触发事件中既有删除、更新又有插入时,如何判断触发器是因哪个事件而动作?,在IF语句中使用触发器谓词(INSERTING、UPDATING、DELE

13、TING),10.2 DML触发器,3、多条件触发形式:,CREATE OR REPLACE TRIGGER BEFORE insert OR update OR delete ON BEGIN IF INSERTING THEN END IF; IF DELETING THEN END IF; IF UPDATING THEN END IF; End;,25,例句5:用触发器增强参照完整性约束。当orders表的orderid发生变化时,orderdetails表的相关行也跟着进行适当的修改。,CREATE OR REPLACE TRIGGER cascade_updateorders AF

14、TER update OR delete ON orders FOR EACH ROW BEGIN IF updating THEN UPDATE orderdetails SET orderdetails .orderid=:new.orderid WHERE orderdetails .orderid=:old.orderid; END IF; IF deleting THEN DELETE FROM orderdetails WHERE orderdetails .orderid=:old.orderid; END IF; END;,10.2 DML触发器,26,10.2 DML触发器,

15、4、级联触发器 把一个数据库触发器的动作与另一个触发器联系起来,使之触发另一个触发器。 例5:创建3个表A、B、C,在表A上设置一个INSERT触发器,用于向表B添加一条记录,在表B 上设置一个INSERT触发器,用于向表C添加一条记录, ,在表C 上设置一个INSERT触发器,用于对表中的所有记录进行更新(+10) 创建A、B、C三张表 CREATE TABLE A(AID number); CREATE TABLE B(BID number); CREATE TABLE C(CID number);,27,10.2 DML触发器,-在表A上创建INSERT触发器 CREATE OR REP

16、LACE TRIGGER insert_a AFTER insert ON A BEGIN INSERT INTO b VALUES(1); END; -在表B上创建INSERT触发器 CREATE OR REPLACE TRIGGER insert_b AFTER insert ON B BEGIN INSERT INTO c VALUES(2); END;,28,10.2 DML触发器,-在表C上创建INSERT触发器 CREATE OR REPLACE TRIGGER insert_a AFTER insert ON C BEGIN UPDATE a SET aid=aid+10; End; -测试,向A表插入数据5 INSERT INTO A VALUES(5);,29,5、限制触发器的执行WHEN子句来保证,当某些行满足一定条件时,在该行上行级触发器才被触发。 它只适用于行级触发器 在WHEN的条件中,old和new或在REFERENCING子句中为old和new起的别名,都不加冒号(:)。,10.2 DML触发器,30,例6:在products表上创建一个触发器,用于在更新

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号