oracleDML触发器.ppt

上传人:牧羊曲112 文档编号:6513398 上传时间:2023-11-08 格式:PPT 页数:36 大小:492KB
返回 下载 相关 举报
oracleDML触发器.ppt_第1页
第1页 / 共36页
oracleDML触发器.ppt_第2页
第2页 / 共36页
oracleDML触发器.ppt_第3页
第3页 / 共36页
oracleDML触发器.ppt_第4页
第4页 / 共36页
oracleDML触发器.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《oracleDML触发器.ppt》由会员分享,可在线阅读,更多相关《oracleDML触发器.ppt(36页珍藏版)》请在三一办公上搜索。

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 triggering_eventWHEN t

2、rigger_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 替代触发器10.4 系统事件触发器10.5 用户事件触发器10.6

3、 管理触发器,7,10.2 DML触发器,DML触发器是针对某个表进行DML操作时触发的。语法格式:CREATE OR REPLACE TRIGGER trigger_nameBEFORE|AFTER|INSERT|DELETE|UPDATEOF column,column ON table_name|view_nameREFERENCING OLD ASold_name|NEW AS new_nameFOR EACH ROW WHEN trigger_condition trigger_body;,8,在编写触发器源代码之前,必须先确定其触发时间、触发事件及触发器的类型。,DML触发器类型,

4、行级触发器,语句级触发器,DML触发器触发事件,表更新,表插入,表删除,DML触发器触发时间(时机),BEFORE,AFTER,10.2 DML触发器,9,触发事件(如INSERT、UPDATE、DELETE等),触发器脚本,触发时机BEFORE(事件),触发对象表,BEFORE触发器,10,触发器事件(如INSERT、UPDATE、DELETE等),触发器脚本,触发时机AFTER(事件),触发对象表,AFTER触发器,11,语句级触发器与行级触发器的区别:,触发器脚本(1次),语句级,触发器脚本,行级,行级,行级,触发器脚本,触发器脚本(n次),10.2 DML触发器,12,10.2 DML

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

6、etailsBEGIN INSERT INTO orderdetails_tablelog VALUES(user,sysdate,delete);END;注:在该触发器被触发后,尽管一次删除多条记录,但触发器只执行一次插入操作。,查看触发器的定义文本使用数据字典user_source,14,10.2 DML触发器,2、行级触发器行级触发器是按触发语句所处理的行激发的,可以引用受到影响的行值。创建触发器时采用关键字FOR EACH ROW这种访问是通过两个相关的标识符实现的:old:用于存放未进行修改前的数据。:new:用于存放进行修改后的数据。,15,10.2 DML触发器,例2:创建一个o

7、rderdetails_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 OR REPLACE TRIGGER deleRow_orderdetailsAFTER delete ON orderdetailsFOR EACH R

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

9、or each rowBEGINIF(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”应注意:在BEFORE类型行级触发器和AFTER类型行级触发器中使用这些标识符。在语句级触发器中不要使用这些标识符。在PL/SQL语句或SQL语句中,这些标识符前加上冒号(:)来引用它们。在行级触发器

10、的WHEN条件中使用该标识符时,前面不要加冒号(:).在BEFORE触发器中不能修改“:old”,在AFTER触发器中不能修改“:new”,10.2 DML触发器,20,触发时机BEFORE后,:new的值还没有被插入到表里,因此:new可以修改,而此时,:old值是表中没有被修改的值,因此不能被修改,触发器脚本,触发时机BEFORE(事件),触发对象表,:new,:old,21,触发器事件(如INSERT、UPDATE、DELETE等),触发器脚本,:new,:old,触发时机AFTER后,:new的值已经被插入到表里,因此:new不能修改,触发时机AFTER(事件),22,10.2 DML

11、触发器,例句4:用触发器实现在用户添加数据时,使用序列生成的数字,为表的主键提供自动编号的键值。-创建表CREATE TABLE temp_table(temp_id number,name varchar2(30);-创建序列CREATE SEQUENCE incrIDSTART WITH 10 INCREMENT BY 5NOMAXVALUECACHE 10;,23,10.2 DML触发器,-创建触发器以提供自动编号的键值CREATE OR REPLACE TRIGGER incr_triggerBEFORE INSERT ON temp_tableFOR EACH ROWDECLARE

12、next_no number;BEGIN SELECT incrID.nextval INTO next_no FROM DUAL;:new.temp_id:=next_no;END;,24,当一个触发器中的触发事件中既有删除、更新又有插入时,如何判断触发器是因哪个事件而动作?,在IF语句中使用触发器谓词(INSERTING、UPDATING、DELETING),10.2 DML触发器,3、多条件触发形式:,CREATE OR REPLACE TRIGGER BEFORE insert OR update OR delete ON BEGIN IF INSERTING THEN END IF;

13、IF DELETING THEN END IF;IF UPDATING THEN END IF;End;,25,例句5:用触发器增强参照完整性约束。当orders表的orderid发生变化时,orderdetails表的相关行也跟着进行适当的修改。,CREATE OR REPLACE TRIGGER cascade_updateordersAFTER update OR delete ON ordersFOR EACH ROWBEGINIF updating THEN UPDATE orderdetails SET orderdetails.orderid=:new.orderid WHERE

14、 orderdetails.orderid=:old.orderid;END IF;IF deleting THENDELETE FROM orderdetails WHERE orderdetails.orderid=:old.orderid;END IF;END;,10.2 DML触发器,26,10.2 DML触发器,4、级联触发器把一个数据库触发器的动作与另一个触发器联系起来,使之触发另一个触发器。例5:创建3个表A、B、C,在表A上设置一个INSERT触发器,用于向表B添加一条记录,在表B 上设置一个INSERT触发器,用于向表C添加一条记录,在表C 上设置一个INSERT触发器,用于

15、对表中的所有记录进行更新(+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 REPLACE TRIGGER insert_aAFTER insert ON ABEGIN INSERT INTO b VALUES(1);END;-在表B上创建INSERT触发器CREATE OR REPLACE TRIGGER insert_bAFTER insert ON BBEGIN I

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

17、2 DML触发器,30,例6:在products表上创建一个触发器,用于在更新产品单价时,如果是类别为的产品则打九五折,其他的产品价格按需要进行更新。CREATE OR REPLACE TRIGGER update_prodpriceBEFORE UPDATE OF unitprice ON products FOR EACH ROWWHEN(new.categoryid=2)BEGIN:new.unitprice:=:old.unitprice*0.95;END;,10.2 DML触发器,31,测试语句:UPDATE products SET unitprice=unitprice+10 W

18、HERE productid=3;UPDATE products SET unitprice=unitprice+10 WHERE productid=1;,10.2 DML触发器,32,6、触发时机,BEFORE触发器和AFTER触发器在触发过程中各自执行的顺序不同。一般执行的顺序是BEFORE触发器、约束、表的DML操作和AFTER触发器。,当一个表上有多个触发器时,每个触发器都是何时触发?,10.2 DML触发器,33,触发器的限制,CREATE TRIGGER语句文本的字符长度不能超过32KB;或者,如果触发器的逻辑编码超过60行,则最好将主要代码保存到存储过程里。使用时只需从触发器中

19、调用存储过程即可。不要创建递归式触发器,否则,系统会因触发器与表之间的循环操作而导致内存用尽,系统崩溃。触发器体内的SELECT语句只能为SELECT INTO 结构,或者为定义游标所使用的SELECT语句。触发器中不能使用数据库事务控制语句 COMMIT,ROLLBACK,SVAEPOINT语句;,34,触发器的限制,由触发器所调用的过程或函数也不能使用数据库事务控制语句;不能在触发体内使用DDL语句;触发器中不能声明LONG,LONG RAW 类型变量,也不能在触发表的LONG或LONG RAW列上使用:new和:old;触发器内可以读取LOB类型的列值,但不能通过:NEW修改LOB列中的数据,35,小结,掌握1、理解触发器的概念及作用2、掌握触发器的应用,36,策 划:毛应爽,课 件 制 作:毛应爽,电 话:0431-86822050,E-mail地址:,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号