ORACLE 触发器 INSRETING,UPDATING,DELETING 函数

当对表行DML操作时,如果有多种操作 即INSERT,UPDATE,DELETE同时存在时,怎么判断对表进行的操作是哪一种呢?   

ORACLE提供了三个内置

函数INSRETING,UPDATING,DELETING.
如下:
CREATE TABLE temp(id number(3),name varchar2(10));
insert into temp values (1,'a');

CREATE TRIGGER temp_audis AFTER UPDATE OR DELETE OR INSERT ON temp 
FOR EACH ROW 
BEGIN
   IF updating THEN
      dbms_output.put_line('the opreation is update on temp');
   ELSIF inserting THEN 
      dbms_output.put_line('the opreation is inserting a row to temp');
   ELSE
      dbms_output.put_line('the opreation is delete a row from temp');
   END IF; 
END ;


替代触发器
考虑以下情况:  有两张表A,B当向表A中插入一条数据时,同时向B中也插入一条相同的数据,以保持同步. 同理向B中插入一条记录时也向A插

入一条同样的记录,以保持数据同步.如果向往常一样建触发器,会造成循环.但要想实现这样的功能,怎么办呢?   ORACLE提供了替代触发

器(INSTEAD OF) ,替代触发器是专对于视图的.  考虑刚才的情况,对表改名,建立同名视图A,B,然后在视图上建立替代触发器,触发器主代

码对表进行操作,这样就避免了循环,实现所述功能.
CREATE TABLE A (ID NUMBER(2)) ;
CREATE TABLE B (ID NUMBER(2)) ;
ALTER TABLE A RENAME TO A_V ;
ALTER TABLE B RENAME TO B_V ;
CREATE VIEW A AS SELECT * FROM A_V ;
CREATE VIEW B AS SELECT *FROM B_V ;
CREATE TRIGGER A_BIS INSTEAD OF INSERT ON A FOR EACH ROW 
BEGIN
INSERT INTO B_V VALUES(:NEW.ID);
INSERT INTO A_V VALUES(:NEW.ID);
END ;
CREATE TRIGGER B_BIS INSTEAD OF INSERT ON B FOR EACH ROW 
BEGIN
INSERT INTO B_V VALUES(:NEW.ID);
INSERT INTO A_V VALUES(:NEW.ID);
END ;
当执行INSERT INTO A VALUES(2); ORACLE并不向A中插入一行,它只是执行触发器的代码,至于触发语句本身,则被跳过了,这就是所谓的"替代"吧.

你可能感兴趣的:(oracle,触发器)