<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色影在线| 免费又黄又爽又猛的毛片 | 日韩插啊免费视频在线观看| 亚洲国产成人五月综合网| 亚洲av中文无码字幕色不卡| 日韩精品视频免费观看| 亚洲欧美日本韩国| 青青草国产免费久久久91| 亚洲av无码兔费综合| 免费黄色网址入口| 在线观看亚洲电影| 亚洲天堂在线视频| 中国好声音第二季免费播放| 亚洲日韩v无码中文字幕 | v片免费在线观看| 中文国产成人精品久久亚洲精品AⅤ无码精品| 特级毛片全部免费播放a一级| 亚洲裸男gv网站| 国产色爽免费无码视频| 7777久久亚洲中文字幕蜜桃| 国产免费不卡v片在线观看| 亚洲三级在线观看| 亚洲精品天堂成人片?V在线播放| 国产免费人成视频在线播放播| 亚洲AV无码专区国产乱码电影| 中文字幕免费视频| 亚洲精品9999久久久久无码| 一本色道久久88亚洲综合| 东方aⅴ免费观看久久av| 亚洲精品亚洲人成在线麻豆| 成人啪精品视频免费网站| 全部一级一级毛片免费看| 亚洲av永久无码精品古装片| 黄页网站在线看免费| 人妻仑刮八A级毛片免费看| 久久精品国产99精品国产亚洲性色| 1000部无遮挡拍拍拍免费视频观看| 亚洲人成色4444在线观看| 亚洲中文字幕久久精品无码喷水 | 美女被免费网站91色| 亚洲沟沟美女亚洲沟沟|