Oracle触发器的触发器类型.

如题所述

第1个回答  2016-06-04


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…  BEFOREinsertorupdateordelete  ON…  BEGIN  IFINSERTINGTHEN  …  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)创建序列logID  CREATESEQUENCElogID  STARTWITH1  INCREMENTBY1  NOMAXVALUE  CACHE10;
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_a  AFTERinsertONA  Begin  insertintobvalues(1);  End;  --在表B上创建INSERT触发器  CREATEORREPLACETRIGGERinsert_b  AFTERinsertONB  Begin  insertintocvalues(2);  End;  -在表C上创建INSERT触发器  CREATEORREPLACETRIGGERinsert_c  AFTERinsertONC  BEGIN  UPDATEa  SETaid=aid+10;  End;  --测试,向A表插入数据5  INSERTINTOAVALUES(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_orderdetails  after delete on orderdetails  for each row   begin  insert into orderdetails_tablelog(who,oper_date,orderid,productid)  values(user,sysdate,:old.orderid,:old.productid);  end;

相似回答