<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
    主站蜘蛛池模板: 日韩吃奶摸下AA片免费观看| 久久久久久一品道精品免费看| 99在线视频免费观看视频| 亚洲av女电影网| 免费日本一区二区| 亚洲视频在线观看免费视频| 中文字幕免费视频一| 亚洲国产成人久久77| 成人免费午夜在线观看| 亚洲日韩国产一区二区三区在线| 免费看片免费播放| 亚洲av午夜国产精品无码中文字| 凹凸精品视频分类国产品免费| 亚洲精品国产摄像头| 欧美大尺寸SUV免费| 亚洲AV综合永久无码精品天堂 | 亚洲伊人久久大香线蕉| 精品成在人线AV无码免费看| 久久精品国产亚洲αv忘忧草| 97无码免费人妻超级碰碰夜夜 | 国产精品午夜免费观看网站| 亚洲精品~无码抽插| 57pao一国产成视频永久免费| 亚洲一线产品二线产品| 亚洲第一视频在线观看免费| 国产在线观看免费视频软件 | 最近更新免费中文字幕大全| 亚洲嫩模在线观看| 最近中文字幕mv手机免费高清| 极品色天使在线婷婷天堂亚洲| 激情97综合亚洲色婷婷五| 91黑丝国产线观看免费| 国产在亚洲线视频观看| 亚洲成熟xxxxx电影| 日韩高清在线免费观看| 免费人成在线观看视频高潮| 亚洲乱码日产精品一二三| 亚洲夜夜欢A∨一区二区三区| 67194熟妇在线永久免费观看 | 国产精品亚洲综合五月天| 亚洲第一网站男人都懂|