Oracle触发器的触发器类型.

故事征集作者 / 探视社 / 2026-06-19 14:02
"
近期关于Oracle触发器的触发器类型.的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内

近期关于Oracle触发器的触发器类型.的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,将是我们最大的荣幸。

1、语句级触发器语句级触发器在每个数据修改语句执行后只调用一次,而不管这一操作将影响到多少行。

例1:创建一个orderdetails_tablelog表及一个AFTER触发器,用于记录是哪些用户删除了orderdetails表中的数据及删除的时间。

--先创建表

createtableorderdetails_tablelog

(

whovarchar2(40),

oper_datedate

);

--再做触发器

createorreplacetriggerdele_orderdetails

afterdeleteonorderdetails

begin

insertintoorderdetails_tablelog (who,oper_date) values(user,sysdate);

end;

注意:在该触发器被触发后,尽管一次删除多条记录,但是触发器只执行一次插入操作;

例2:创建一个 BEFORE 触发器,使得在向 ORDERS 表中插入记录之前对 ShippedDate字段进行检测, 要求其值不允许为周六或周日,发货时间应在8-18点之间.否则将提示错误’发货时间应为工作时间’.

create or replace trigger secure_shippeddate

before insert on orders

for each row

begin

if

(to_char(:new.shippeddate,’dy’)in('星期六','星期日'))

or

(to_number(to_char(:new.shippeddate,’hh24’))not between 8 and 18)

then

raise_application_error(-20500,’发货时间应为工作时间’);

endif;

end;

2、多条件触发器

CREATEORREPLACETRIGGER…BEFOREinsertorupdateordeleteON…BEGINIFINSERTINGTHEN…ENDIF;IFDELETINGTHEN…ENDIF;IFUPDATINGTHEN…ENDIF;End;例3:创建一个多条件触发器,用于实现记录用户对产品表进行的操作类型,操作时间,用户名(创建一个prod_operate_log表记载信息,其中操作编号自动增长).1)创建prod_operate_log表CREATETABLEprod_operate_log(OperIDnumber,usernamevarchar2(200),Operate_datetimestamp,Operate_typevarchar2(10));2)创建序列logIDCREATESEQUENCElogIDSTARTWITH1INCREMENTBY1NOMAXVALUECACHE10;

3、级联触发器把一个数据库触发器的动作与另一个触发器联系起来,使之触发另一个触发器。

例4:创建3个表A、B、C,在表A上设置一个INSERT触发器,用于向表B添加一条记录,在表B上设置一个INSERT触发器,用于向表C添加一条记录,,在表C上设置一个INSERT触发器,用于对A表中的所有记录进行更新(+10)

创建A、B、C三张表CREATETABLEA(AIDnumber);CREATETABLEB(BIDnumber);CREATETABLEC(CIDnumber);创建触发器表--在表A上创建INSERT触发器CREATEORREPLACETRIGGERinsert_aAFTERinsertonABegininsertintobvalues(1);End;--在表B上创建INSERT触发器CREATEORREPLACETRIGGERinsert_bAFTERinsertonBBegininsertintocvalues(2);End;-在表C上创建INSERT触发器CREATEORREPLACETRIGGERinsert_cAFTERinsertonCBEGINUPDATEaSETaid=aid+10;End;--测试,向A表插入数据5INSERTINTOAVALUES(5);

4、行级触发器行级触发器是按触发语句所处理的行激发的,可以引用受到影响的行值。创建触发器时采用关键字FOREACHROW这种访问是通过两个相关的标识符实现的:old:用于存放未进行修改前的数据:new:用于存放进行修改后的数据例5:修改 orderdetails_tablelog 表,增加两列 orderid,productid,并创建一个 after 触发器,用于记录是哪些用户在什么时间删除了 orderdetails 表中的哪些数据。--先增加两列alter table orderdetails_tablelog add orderid number;alter table orderdetails_tablelog add productid number;--再做触发器create or replace trigger dele_orderdetailsafter delete on orderdetailsfor each row begininsert into orderdetails_tablelog(who,oper_date,orderid,productid)values(user,sysdate,:old.orderid,:old.productid);end;

关于Oracle触发器的触发器类型.的探讨就到这里,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们,同时别忘了点击关注哦!

分享到
声明:本文为用户投稿或编译自英文资料,不代表本站观点和立场,转载时请务必注明文章作者和来源,不尊重原创的行为将受到本站的追责;转载稿件或作者投稿可能会经编辑修改或者补充,有异议可投诉至本站。

热文导读