Oracle 觸發器


Oracle觸發器 數據庫

1、定義:
    在觸發事件發生時隱式自動運行的(PL/SQL)程序塊。觸發器不能接收參數,不能被別的程序、函數等調用。
2、構成: 
    觸發器名稱
    觸發器的觸發事件
    觸發器的限制條件
    觸發器執行語句
DML觸發器觸發事件:
    表插入、表更新、表刪除
觸發器觸發時機:
    BEFORE AFTER
觸發器種類:
    1.語句級觸發器:
        語句級觸發器在每一個數據修改語句執行後只調用一次,而無論這一操做將影響到多少行。
     摘自百科:   例:建立一個orderdetails_tablelog表及一個AFTER觸發器,用於記錄是哪些用戶刪除了orderdetails表中的數據及刪除的時間。
            CREATE TABLE orderdetails_tablelog
            (
                   WHO VARCHAR2(40),
                   OPER_DATE DATE
            );
            CREATE OR REPLACE TRIGGER DELE_ORDERDETAILS
              AFTER DELETE ON ORDERDETAILS
            BEGIN
              INSERT INTO ORDERDETAILS_TABLELOG
                (WHO, OPER_DATE)
              VALUES
                (USER, SYSDATE);
    在該觸發器被觸發後,儘管一次刪除多條記錄,但觸發器只執行一次插入操做。函數

    2.行級觸發器
    行級觸發器是按觸發語句所處理的行激發的,能夠引用受到影響的行值。建立觸發器時採用關鍵字FOR EACH ROW
    這種訪問是經過兩個相關的標識符實現的
    :old :用於存放未進行修改前的數據
    :new :用於存放進行修改後的數據事件


    3.級聯觸發器
    把一個數據庫觸發器的動做與另外一個觸發器聯繫起來,使之觸發另外一個觸發器。ip

    
3、語法:
    CREATE [OR REPLACE] TRIGGER trigger_name    --觸發器名字
    {BEFORE | AFTER | INSTEAD OF} triggering_event  --觸發事件
    [WHEN trigger_condition]                 --限制條件
    [FOR EACH ROW]                          --行級觸發
    trigger_body;                                  --執行語句體it

    語法說明:
    trigger_name是觸發器的名稱。
    triggering_event說明了激發觸發器的事件(也可能包括特殊的表或視圖)。
     trigger_body是觸發器的代碼。
    若是在WHEN子句中指定trigger_condition的話,則首先對該條件求值。觸發器主體只有在該條件爲真值時才運行。io

    DML觸發器是針對某個表進行DML操做時觸發的。
    DML = Data manipulation language(數據操縱語言)event

詳細語法格式: 
    CREATE [ OR REPLACE ] TRIGGER trigger_name
    { BEFORE | AFTER }
    { INSERT | DELETE | UPDATE [OF column[,column…] ] } ON { table_name | view_name}
    [ REFERENCING 
    { OLD [AS] old_name | NEW [AS] new_name } ]
    [ FOR EACH ROW ] 
    [ WHEN trigger_condition ] 
    trigger_body;table


4、例子date

create or replace trigger "TRI_SA_UPDATE" 
  after update on xx_table  (BEFORE INSERT ON)
  for each row
declare
  -- local variables here
begin

  IF :NEW.NUM_VALUE <> :OLD.NUM_VALUE THEN
       XXX
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20001, '',TRUE);
end TRI_SA_UPDATE;語法

相關文章
相關標籤/搜索