隨筆-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 黃小二 閱讀(1525) 評論(0)  編輯  收藏 所屬分類: [DB].Oracle
          主站蜘蛛池模板: 和平区| 皋兰县| 美姑县| 内江市| 辽中县| 巴彦县| 城市| 黔西县| 获嘉县| 扎赉特旗| 绥江县| 普兰店市| 雅安市| 屯门区| 固镇县| 合山市| 辽中县| 依兰县| 满城县| 仙居县| 奉化市| 洛川县| 北流市| 江北区| 双牌县| 谷城县| 福贡县| 漯河市| 灯塔市| 都安| 尚义县| 东安县| 西乌珠穆沁旗| 平利县| 东台市| 巴东县| 锡林浩特市| 泸西县| 体育| 阿拉善盟| 上饶市|