Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評(píng)論 :: 0 Trackbacks
          DML觸發(fā)器

          ??? CREATE [OR REPLACE] TRIGGER trigger_name
          ??? {BEFORE | AFTER }
          ??? {INSERT | DELETE | UPDATE [OF column [, column ...]]}
          ??? ON {[schema.] table_name | [schema.] view_name}
          ??? [PRFERENCING {OLD [AS] old | NEW [AS] new | PARENT as parent}]
          ??? [FOR EACH ROW ]
          ??? [WHEN condition]
          ??? Trigger body;

          ??? 說(shuō)明:
          ??? 1 BEFORE/AFTER :指觸發(fā)時(shí)間在 DML 操作之前還是之后 ( 對(duì)表配置約束時(shí)特別有用 )
          ??? 2 DML 包括 INSERT DELETE UPDATE( 可以只針對(duì)某幾列 )
          ??? 3 FOR EACH ROW :表明是行級(jí)觸發(fā)器


          DML 觸發(fā)器示例

          ??? 1 、創(chuàng)建信息表和最終表

          ??? create table t11(a int ,b varchar2 ( 100 ));
          ??? insert into t11 values ( 1 , 'aaa' );
          ??? insert into t11 values ( 1 , 'bbb' );
          ??? insert into t11 values ( 1 , 'ccc' );
          ??? insert into t11 values ( 2 , 'ddd' );
          ??? insert into t11 values ( 2 , 'eee' );
          ??? insert into t11 values ( 3 , 'fff' );
          ??? insert into t11 values ( 4 , 'ggg' );
          ??? insert into t11 values ( 5 , 'hhh' );
          ??? commit ;

          ??? create table t1_log(
          ??? ?? who varchar2 ( 30 ),
          ??? ?? poer_date date
          ??? ?? );

          ??? 2 、創(chuàng)建觸發(fā)器

          ??? create or replace trigger delete_trigger
          ??? ? after delete
          ??? ? on t11
          ??? ? for each row -- 行級(jí)觸發(fā)器
          ??? begin
          ??? ? insert into t1_log values ( user , sysdate );
          ??? end ;

          ??? 3 、測(cè)試

          ??? delete from t11 where a= 1 ;

          ??? SQL > select * from t1_log;
          ?
          ??? WHO????? POER_DATE
          ??? ------- -------------------
          ??? WXQ????? 2008 - 11 - 2 14 : 04 : 38
          ??? WXQ????? 2008 - 11 - 2 14 : 04 : 38
          ??? WXQ????? 2008 - 11 - 2 14 : 04 : 38

          ??? 注:若沒(méi)有 for each row 語(yǔ)句,則只插入一行記錄。


          觸發(fā)器的級(jí)聯(lián)

          ??? create table t1_a( id int );
          ??? create table t1_b( id int );
          ??? create table t1_c( id int );

          ??? create trigger tr_a
          ??? ? after insert
          ??? ? on t1_a
          ??? begin
          ??? ? insert into t1_b values ( 1 );
          ??? end ; -- 插入 t1_a 時(shí),插入 t1_b

          ??? create trigger tr_b
          ??? ? after insert
          ??? ? on t1_b
          ??? begin
          ??? ? insert into t1_c values ( 1 );
          ??? end ; -- 插入 t1_b 時(shí),插入 t1_c

          ??? create trigger tr_c
          ??? ? after insert
          ??? ? on t1_c
          ??? begin
          ??? ? update tr_a set tr_a.id=tr_a.id+ 10 ;
          ??? end ; -- 插入 t1_c 時(shí),更新 t1_a

          ??? 測(cè)試:

          ??? SQL > insert into t1_a values ( 5 );
          ??? 1 row inserted

          ??? SQL > select * from t1_a;
          ??? ?? ID
          ??? -----
          ??? ?? 15


          多條件觸發(fā)器

          ??? CREATE OR REPLACE TRIGGER
          ??? BEFORE INSERT OR UPDATE OR DELETE
          ??? BEGIN
          ????? IF inserting THEN
          ????? --insert 語(yǔ)句觸發(fā)
          ????? ELSIF updating THEN
          ????? --update 語(yǔ)句觸發(fā)
          ????? ELSIF deleting THEN
          ????? --delete 語(yǔ)句觸發(fā)
          ????? END IF;
          ??? END;

          ??? 注:若要針對(duì) update 某一列,則用 IF UPDATING('xx') THEN...

          ??? 具體舉例

          ??? create or replace trigger oper_trigger
          ??? ? before insert or update or delete
          ??? ? on t1
          ??? declare
          ??? ? str_action varchar2 ( 100 );
          ??? begin
          ??? ? if inserting then
          ??? ??? str_action:= 'Insert' ;
          ??? ? end if ;
          ??? ? if updating then
          ??? ??? str_action:= 'Update' ;
          ??? ? end if ;
          ??? ? if deleting then
          ??? ??? str_action:= 'Delete' ;
          ??? ? end if ;
          ??? ? insert into t1_log values (str_action, sysdate );
          ??? end ;


          行級(jí)觸發(fā)器特性

          ??? 1 、簡(jiǎn)單舉例

          ??? create or replace trigger reco_trigger
          ??? ? after delete
          ??? ? on t11
          ??? ? for each row
          ??? begin
          ??? ? insert into t22 values (:old.a,:old.b);
          ??? end ;

          ??? 2 、說(shuō)明:

          ??? * 可以通過(guò) :new :old 來(lái)獲得操作前后的不同數(shù)據(jù)映像
          ??? * update 可同時(shí)使用 :new :old insert 只能用 :new delete 只能用 :old

          ??? 3 、通過(guò) REFERENCING 修改映像標(biāo)識(shí)符

          ??? create or replace trigger reco_trigger
          ??? ? before update
          ??? ? on t11
          ??? ? referencing new as my_value -- 注意格式
          ??? ? for each row
          ????? when (my_value.a > 10 ) -- 新值大于 10 時(shí)才觸發(fā)
          ??? begin
          ??? ? insert into t22 values (:my_value.a,:my_value.b);
          ??? end ;

          ??? 注意:即使重命名了,但是還是要在前面加“ : ”,但是在 referencing when 字句中不用加







          -The End-

          posted on 2008-10-21 17:35 decode360-3 閱讀(178) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 汝城县| 凉山| 彰武县| 罗定市| 礼泉县| 唐河县| 卢湾区| 南宁市| 永昌县| 阳曲县| 荣成市| 会理县| 遵义县| 蓬溪县| 新兴县| 宜都市| 义马市| 天门市| 绍兴市| 通州区| 布尔津县| 永济市| 贺兰县| 白玉县| 通许县| 彰化县| 平江县| 安平县| 仁化县| 山西省| 濮阳市| 大丰市| 蒙山县| 丰台区| 九江县| 绿春县| 灵武市| 镇坪县| 通州区| 石河子市| 杭锦旗|