oracle:觸發器,自治事務,instead of trigger,trigger


觸發器的格式:

CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE| AFTER} {UPDATE| INSERT| DELETE|SELECT} ON table_name
[FOR EACH ROW]
[FOLLOWS another_trigger]
[ENABLE| DISABLE] [WHEN condition] DECLARE xxxx; BEGIN NULL; [EXCEPTION] END;

這是一般的觸發器格式。

BEFORE|AFTER:選擇觸發器在 DML操作之前還是之后發生。

不知道觸發器能不能夠對 SELECT 起作用,應該可以的。

FOR EACH ROW:指定行觸發器,只適用於UPDATE,INSERT,DELETE。

FOLLOWS,指定觸發器的順序,11g 以后使用的。

ENABLE|DISABLE:指定觸發器啟用還是禁用。(默認啟動)

或者通過下列語句

ALTER TRIGGER trigger_name {ENABLE|DISABLE};

 

WHEN:指定執行觸發器時必須要滿足的條件。

一個表被刪除,則定義在這表上的觸發器也會被刪除。

注意:

1.觸發器也許不會執行事務控制語句,e.g.COMMIT、SAVEPOINT、ROLLBACK.當觸發器執行是,所有執行的操作會稱為事務的一部分。當事務被提交或滾回,觸發器的才做也會提交或滾回。如果想跳出此規則可以通過 自治事務

2.觸發器調用任何的函數或者過程也許不會執行事務控制語句。除非包含 自治事務

3.不允許在觸發器中聲明LONG 或者 LONG RAW 變量。

 

觸發器中包含兩個偽記錄,分別為  :NEW 、 :OLD,使用時包括冒號,用於標識新的數據(INSERT時的)、舊的數據(delete時的)或者UPDATE則兩者都有。邏輯上不存在時被設置為 NULL

這兩者可以看做RECORD 使用。

 

觸發器中提供布爾函數檢查觸發的是DML中何種狀態,如下:

CREATE TRIGGER trigger_name 
AFTER UPDATE OR DELETE ON table_name
DECLARE
  v_type VARCHAR(20);
BEGIN
  IF UPDATING THEN
     v_type  := 'updating' ;
  ELSIF DELETING THEN
     v_type := 'deleting';
  END IF;
  xxxxxxx;
END;

 

 

自治事務:

    由其他事務(通常稱為主事務)發起的獨立事務。也就是說,自治事務也許會執行多個DML語句,並且提交或者滾回操作,而不會提交或者滾回主事務執行的DML語句。

 例子:

    有一個觸發器,在table 執行UPDATE 之后被觸發,以記錄審計數據。假設你希望即使主事務失敗,仍舊能夠記錄審計數據(即觸發器操作仍然有效)。這樣可以通過 自治事務實現。

 語法:

CREATE OR REPLACE TRIGGER trigger_name
AFTER UPDATE ON table_name
DECLARE
  xx;
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  xx;

  COMMIT;
END;

 

PRAGMA  AUTONOMOUS_TRANSACTION;  和 COMMMIT; 語句是必須的。

 

代替觸發器(INSTEAD OF 觸發器)

代替觸發器定義於視圖

CREATE OR REPLACE trigger_name
INSTEAD OF DELETE ON table_name
BEGIN
  xxxx;
END;

 

假如在一個視圖上進行刪除操作,但是有完整性約束,可以通過INSTEAD OF 觸發器刪除約束表的數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM