<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
    DML觸發器

    ??? 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;

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


    DML 觸發器示例

    ??? 1 、創建信息表和最終表

    ??? 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 、創建觸發器

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

    ??? 3 、測試

    ??? 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

    ??? 注:若沒有 for each row 語句,則只插入一行記錄。


    觸發器的級聯

    ??? 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 時,插入 t1_b

    ??? create trigger tr_b
    ??? ? after insert
    ??? ? on t1_b
    ??? begin
    ??? ? insert into t1_c values ( 1 );
    ??? end ; -- 插入 t1_b 時,插入 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 時,更新 t1_a

    ??? 測試:

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

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


    多條件觸發器

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

    ??? 注:若要針對 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 ;


    行級觸發器特性

    ??? 1 、簡單舉例

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

    ??? 2 、說明:

    ??? * 可以通過 :new :old 來獲得操作前后的不同數據映像
    ??? * update 可同時使用 :new 、 :old , insert 只能用 :new delete 只能用 :old

    ??? 3 、通過 REFERENCING 修改映像標識符

    ??? create or replace trigger reco_trigger
    ??? ? before update
    ??? ? on t11
    ??? ? referencing new as my_value -- 注意格式
    ??? ? for each row
    ????? when (my_value.a > 10 ) -- 新值大于 10 時才觸發
    ??? 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 閱讀(174) 評論(0)  編輯  收藏 所屬分類: Oracle
    主站蜘蛛池模板: 久久99国产综合精品免费| 免费成人午夜视频| 亚洲人成网站在线播放2019| 又爽又高潮的BB视频免费看| 97在线免费观看视频| 亚洲综合中文字幕无线码| 亚洲成A∨人片天堂网无码| 日韩精品久久久久久免费 | 亚洲成AV人片在WWW| 自拍偷自拍亚洲精品被多人伦好爽 | 91频在线观看免费大全| 最新亚洲人成无码网www电影| 亚洲精品无码久久一线| 成年人免费视频观看| 在线观看特色大片免费网站| 亚洲一本到无码av中文字幕| 亚洲精品中文字幕乱码三区 | 亚洲AV无码码潮喷在线观看 | 国产成人精品免费直播| 久久免费视频网站| 在线亚洲v日韩v| 亚洲精品综合久久中文字幕| 亚洲?V无码乱码国产精品| **一级毛片免费完整视| 国产精品极品美女自在线观看免费| 亚洲国产成人精品激情| 亚洲乱码中文字幕综合| 国产精品极品美女免费观看| 最近中文字幕免费mv在线视频| 成人免费网站久久久| 亚洲日本天堂在线| 亚洲毛片在线免费观看| 亚洲国产精品久久久天堂| 免费大片黄手机在线观看| 成人A级毛片免费观看AV网站| 免费人成视频在线观看网站| 中文字幕视频免费在线观看| 精品国产日韩亚洲一区在线| 亚洲av无码一区二区三区天堂古代| 亚洲AV成人一区二区三区AV| 中文字幕精品无码亚洲字|