<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 閱讀(178) 評論(0)  編輯  收藏 所屬分類: Oracle
    主站蜘蛛池模板: 国产V片在线播放免费无码 | 亚洲色一区二区三区四区| 国内精品免费久久影院| 亚洲AⅤ优女AV综合久久久| 一级做a免费视频观看网站| 成年女人毛片免费观看97| 亚洲av乱码一区二区三区香蕉| 最近2019免费中文字幕视频三| 91亚洲国产成人精品下载| 最好看最新的中文字幕免费| 亚洲福利一区二区精品秒拍| 最近中文字幕完整免费视频ww| 亚洲国产综合自在线另类| 免费无码AV片在线观看软件| 亚洲色精品VR一区区三区 | 88av免费观看| 91嫩草亚洲精品| 四虎影视www四虎免费| 男男gay做爽爽的视频免费| 国产成人亚洲综合无码| 182tv免费视频在线观看| 亚洲性色成人av天堂| 成人av免费电影| h视频在线免费观看| 亚洲AV日韩精品久久久久久久| 精品国产免费人成电影在线观看| 中中文字幕亚洲无线码| 亚洲av无码国产精品色在线看不卡 | 奇米影视亚洲春色| 精品熟女少妇av免费久久| 亚洲av无码片在线观看| 国产做床爱无遮挡免费视频| 精品人妻系列无码人妻免费视频| 亚洲国产精品久久久久网站| 影音先锋在线免费观看| 一级免费黄色毛片| 亚洲av无码片区一区二区三区| 亚洲av无码国产精品色在线看不卡| 色猫咪免费人成网站在线观看| 亚洲熟妇无码一区二区三区导航| 亚洲成a人片在线观看老师|