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

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

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

    隨筆-7  評論-24  文章-102  trackbacks-0


    一、行級觸發器
    二、語句級觸發器
    三、替換觸發器
    四、模式級觸發器
    五、數據庫級觸發器



        1、觸發器一旦創建就會立刻生效,有時可能需要臨時禁用觸發器,最常見的原因就是涉及數據加載。
    ALTER TRIGGER trigger_name [ENABLE | DISABLE];

        2、Oracle 觸發器里兩個重要的內存邏輯表 :old 和 :new。:old 表保存的是在DML語句之前的數據,:new 表保存的是在DML語句創建的數據。
            old    new
    INSERT    -    √
    DELETE    √    -
    UPDATE    √    √

        3、在觸發器語句中不能顯式的提交/回滾事務。




    一、行級觸發器
    行級觸發器對 DML 語句影響的每個行執行一次。主要應用保持數據完整性。
    例:兩表級聯更新,修改部門表編號的同時也修改員工表的部門編號:
    CREATE OR REPLACE TRIGGER update_dept
      /* 行級觸發器,在更新部門表操作后觸發 */
      AFTER UPDATE ON deptment
      FOR EACH ROW
    BEGIN
      /* new、old 表的有效利用,把舊表的id列值 更新為 新表的id列值 */
      UPDATE emp SET id=:new.id WHERE id=:old.id;
    END;

    UPDATE deptment SET id='yy' WHERE id='01';

    SELECT * FROM deptment;
    SELECT * FROM emp;


    插入時利用觸發器+序列實現整型字段的自增:
    CREATE OR REPLACE TRIGGER set_no
      BEFORE INSERT ON auto
      FOR EACH ROW
    DECLARE
      sn number(5);
    BEGIN
      /* 觸發器預處理序列的值 */
      SELECT myseq.nextval INTO sn FROM dual;
      :NEW.a := sn;
    END;

    INSERT INTO auto VALUES(21,'dtt');
    SELECT * FROM auto;
    /* 插入時表a列由觸發器產生的值替代用戶的輸入 */


    二、語句級觸發器
    只與語句有關,與行無關,不涉及數據完整性問題。
    例如:利用觸發器記錄,記錄某表中用戶的操作(日志處理)。
    CREATE OR REPLACE TRIGGER dm1_aa
      AFTER INSERT OR DELETE OR UPDATE ON aa
    BEGIN
      IF INSERTING THEN
        INSERT INTO mylog VALUES(user,sysdate,'I');
      ELSEIF DELETING THEN
        INSERT INTO mylog VALUES(user,sysdate,'D');
      ELSE
        INSERT INTO mylog VALUES(user,sysdate,'U');
      END IF;
    END;
    ps.能否記錄多個表?"after insert or delete or update on t1,t2" 出錯。



    三、替換觸發器
    解決Oracle視圖中多表更新的限制,只能在視圖中使用,屬于行級觸發器。
    例如:在視圖中插入新的部門同時插入其所屬的新員工:
    CREATE OF REPLACE TRIGGER tr_v_e_d
      /* 在視圖上創建替換觸發器 */
      INSTEAD OF INSERT ON v_emp_dept
      FOR EACH ROW
    BEGIN
      /* 替換觸發器先插入部門表的信息,然后再插入其所屬員工表的信息 */
      INSERT INTO deptment VALUES(:new.id, :new.name);
      INSERT INTO emp(eid, ename, sex, id) VALUES(:new.eid, :new.ename, :new.sex, :new.d);
    END;

    INSERT INTO v_emp_dept VALUES('456', 'test', 'f', '33', 'hg');
    SELECT * FROM v_emp_dept;


    四、模式級觸發器
    可以在模式對象的操作上建立的觸發器,如 CREATE、ALTER、DROP、GRANT、REVOKE 和 TRUNCATE 等DDL語句。
    [BEFORE | AFTER] trigger_event ON [schema.]SCHEMA
    例如:對用戶所刪除的所有對象進行日志記錄
    CREATE OR REPLACE TRIGGER log_drop_obj
      AFTER DROP ON SCHEMA
    BEGIN
      /* 記錄操作類型、操作對象、操作時間 */
      INSERT INTO dropped_obj VALUES(ORA_DICT_OBJ_NAME, ORA_DICT_TYPE, SYSDATE);
    END;

    CREATE TABLE for_drop(x char);
    DROP TABLE for_drop;

    SELECT * FROM dropped_obj;



    五、數據庫級觸發器
    可以創建在數據庫事件上的觸發器,包括啟動、關閉、服務器錯誤、登錄和注銷等。這些事件都是實例范圍內的,不與特定的表或視圖關聯。
    CREATE OR REPLACE TRIGGER system_startup
      AFTER STARTUP ON DATABASE
    BEGIN
      ...
    END;




    posted on 2008-10-27 00:16 黃小二 閱讀(1522) 評論(0)  編輯  收藏 所屬分類: [DB].Oracle
    主站蜘蛛池模板: 国产黄在线播放免费观看| 亚洲va中文字幕| 114级毛片免费观看| 国产亚洲精品精华液| 国产成年无码久久久免费| 国产美女亚洲精品久久久综合| 理论亚洲区美一区二区三区| 国产精品嫩草影院免费| 亚洲成a人无码亚洲成www牛牛| 国产无遮挡吃胸膜奶免费看视频 | 成人免费网站视频www| 国产大片51精品免费观看| 免费高清A级毛片在线播放| 亚洲成av人片在线观看天堂无码 | 亚洲神级电影国语版| 福利免费观看午夜体检区| 亚洲熟伦熟女专区hd高清| 亚洲AV无码乱码在线观看性色扶| 一级女性全黄久久生活片免费 | 精品亚洲aⅴ在线观看| 免费下载成人电影| 亚洲av日韩aⅴ无码色老头| 亚洲国产成人五月综合网| 黄网站色视频免费在线观看的a站最新| 亚洲欧洲日产国产综合网| 毛片a级毛片免费播放下载| 国产成人亚洲精品播放器下载| 久久久久国产亚洲AV麻豆| 色欲A∨无码蜜臀AV免费播| 色偷偷亚洲女人天堂观看欧| 免费a级毛片无码av| 久久精品国产免费| 在线观看亚洲AV日韩A∨| 亚洲日本韩国在线| 亚洲网站在线免费观看| 美女黄频视频大全免费的| 亚洲三区在线观看无套内射| 久久久久久久免费视频| 五月天婷婷免费视频| 亚洲精品乱码久久久久久下载 | 亚洲综合无码AV一区二区|