您的位置:首页 > 数据库 > Oracle

ORACLE 触发器 INSRETING,UPDATING,DELETING 函数

2014-04-23 09:38 393 查看
当对表行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中插入一行,它只是执行触发器的代码,至于触发语句本身,则被跳过了,这就是所谓的"替代"吧.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: