<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
    主站蜘蛛池模板: 卡一卡二卡三在线入口免费| 啦啦啦完整版免费视频在线观看| 精品国产免费观看一区| 精品亚洲成在人线AV无码| 免费观看的毛片大全| 亚洲一卡二卡三卡四卡无卡麻豆 | 亚洲日本中文字幕天堂网| 国产成人亚洲综合a∨| 四虎永久免费网站免费观看| 高潮内射免费看片| 中文亚洲成a人片在线观看| 99视频在线观看免费| 久久精品国产精品亚洲色婷婷| 日韩人妻一区二区三区免费| 亚洲理论精品午夜电影| 毛片免费在线观看网站| 日本激情猛烈在线看免费观看 | 中文在线观看永久免费| 日本亚洲视频在线| 免费观看美女用震蛋喷水的视频| 亚洲AV无码久久久久网站蜜桃| 成人在线免费观看| 国产免费A∨在线播放| 亚洲国产精品久久久久久| 黄色片在线免费观看| 国产精品久久久久久亚洲小说| 国产精品亚洲αv天堂无码| 91在线老王精品免费播放| 亚洲七久久之综合七久久| 精品国产亚洲男女在线线电影 | 亚洲五月综合缴情婷婷| 又粗又硬又大又爽免费视频播放| 在线观看免费黄色网址| 亚洲免费在线观看视频| 全部免费毛片在线| 99国产精品免费视频观看| 在线观看免费亚洲| 亚洲一区二区三区日本久久九| 青青草国产免费久久久下载| 国产在线精品免费aaa片| 亚洲精华液一二三产区|