天天看點

Oracle——15觸發器

觸發器可實作表間資料的一緻性和完整性。當一個基表被修改時,相應的觸發器會自動執行。對表資料的操作有插入、修改和删除,相應的維護資料的觸發器也大緻有insert、update和delete三種。

觸發器的類型有三種:

(1)DML觸發器:在對表進行DML操作的時候觸發。

(2)替代觸發器:由于在Oracle中不能直接對有兩個以上表建立的視圖進行DML操作,是以給出了替代觸發器,它是Oracle專門為進行視圖操作的一種處理方法。

(3)系統觸發器:它可以在Oracle資料庫系統的事件中進行觸發,如資料庫的開啟和關閉。

觸發器中的關鍵詞:

觸發器中有兩個非常重要的關鍵詞,一個是old,一個是new,old用于修飾操作完成前的值,new用于修飾完成後的值,可以代表一行。此外,隻有行級的觸發器才能使用這兩個關鍵字。

一、利用SQL語句建立觸發器

1、利用SQL建立觸發器的文法格式:

其中,before:觸發器在操作前執行;after:觸發器在操作後執行;instead of:指定建立替代觸發器。

delte、insert、update:指定觸發事件,多個事件間用or連接配接。

of Column:指定在哪些列上執行update觸發。

for each row:表示該觸發器是行級的,隻有行級的觸發器才能使用old和new關鍵字。

示例代碼:

2、建立觸發器的限制

(1)觸發器代碼大小必須小于32KB

(2)觸發器中有效語句可以包括DML語句,但不能包括DDL語句;rollback、commit、savepoint也不能使用。但是,對于系統觸發器可以使用create、alter、drop table和alter...compile語句。

(3)long、long raw和lob的限制:

a.不能插入資料到long或long raw

b.來自long或long raw的資料可以轉換成字元型,但是不能超過32KB

c.使用long或long raw不能聲明變量

d.在long或long raw列中不能使用:new和:parent

e.在lob中的:new變量不能修改

(4)引用包變量的限制:如果update或delete語句檢測到目前的update沖突,則Oracle會執行rollback到savepoint上并重新啟動更新。

3、觸發器觸發順序

(1)執行before語句的觸發器

(2)執行before語句的行級觸發器

(3)執行DML語句

(4)執行after語句的行級觸發器

(5)執行after語句的觸發器

4、建立DML觸發器

觸發器有單獨的名字空間,是以觸發器名可以與表名和過程名相同,但在同一個schema中的觸發器不能重名。

假設現在這樣一個表t_module(id,name),然後這裡面的資料非常重要,我們希望能夠保留它的删除記錄,這樣我們就可以給該表建立如下這樣一個觸發器:

5、建立替代觸發器

由于視圖有可能是由多個表進行關聯而成,這種情況下,直接通過更新視圖來更新基表是不可行的,這個時候我們就可以通過替代觸發器來工作了。

6、建立系統觸發器

系統觸發器是在進行資料庫系統事件時進行觸發,主要包括DDL語句,其文法格式如下:

其中,DDL_EVENT_LIST表示一個或多個DDL事件,多個事件可以用or分開;

database_event_list表示一個說多個資料庫事件,多個事件中間用or分開;

database表示資料庫級觸發器;schema表示使用者級觸發器。

示例代碼如下:

二、觸發器的修改

和過程、視圖一樣,Oracle也提供了alter trigger語句,但是該語句隻是用于重新編譯現有觸發器的,需要修改觸發器需要使用create or replace trigger...語句。

三、觸發器的删除

文法格式: