pl/sql操作資料庫之觸發器的使用
這篇文章講述的是pl/sql操作資料庫之觸發器的使用,如有錯誤或不當之處,還望各位大神批評指正。
什麼是觸發器?
- 觸發器是許多關系資料庫系統都提供的一項技術。在ORACLE系統裡,觸發器類似過程和函數,都有聲明,執行和異常處理過程的PL/SQL塊。
觸發器的類型
觸發器在資料庫裡以獨立的對象存儲,它與存儲過程不同的是,存儲過程通過其它程式來啟動運作或直接啟動運作,而觸發器是由一個事件來啟動運作。即觸發器是當某個事件發生時自動地隐式運作。并且,觸發器不能接收參數。是以運作觸發器就叫觸發或點火(firing)。ORACLE事件指的是對資料庫的表進行的INSERT、UPDATE及DELETE操作或對視圖進行類似的操作。ORACLE将觸發器的功能擴充到了觸發ORACLE,如資料庫的啟動與關閉等。
- DML觸發器:ORACLE可以在DML語句進行觸發,可以在DML操作前或操作後進行觸發,并且可以對每個行或語句操作上進行觸發。
- 替代觸發器:由于在ORACLE裡,不能直接對由兩個以上的表建立的視圖進行操作。是以給出了替代觸發器。它就是ORACLE 8專門為進行視圖操作的一種處理方法。
- 系統觸發器:ORACLE 8i 提供了第三種類型的觸發器叫系統觸發器。它可以在ORACLE資料庫系統的事件中進行觸發,如ORACLE系統的啟動與關閉等。
- 觸發器的組成:
- 觸發事件:即在何種情況下觸發TRIGGER; 例如:INSERT, UPDATE, DELETE。
- 觸發時間:即該TRIGGER 是在觸發事件發生之前(BEFORE)還是之後(AFTER)觸發,也就是觸發事件和該TRIGGER 的操作順序。
- 觸發器本身:即該TRIGGER 被觸發之後的目的和意圖,正是觸發器本身要做的事情。 例如:PL/SQL 塊。
-
觸發頻率:說明觸發器内定義的動作被執行的次數。即語句級(STATEMENT)觸發器和行級(ROW)觸發器。
語句級(STATEMENT)觸發器:是指當某觸發事件發生時,該觸發器隻執行一次;
行級(ROW)觸發器:是指當某觸發事件發生時,對受到該操作影響的每一行資料,觸發器都單獨執行一次。
觸發器的建立
- 觸發器建立的格式
-
可選項:BEFORE | AFTER | INSTEAD OF
觸發事件:是在之前(before)還是在之後(after)還是隻激活觸發器而不出發事件。
注:INSTEAD OF 選項使ORACLE激活觸發器,而不執行觸發事件。隻能對視圖和對象視圖建立INSTEAD OF觸發器,而不能對表、模式和資料庫建立INSTEAD OF 觸發器。
- 可選項:INSERT | DELETE | UPDATE [OF column [, column …]]指的是出發事件,即什麼操作下激活觸發器。
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF column [, column …]]}
ON {[schema.] table_name | [schema.] view_name}
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
trigger_body;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 例1:建立行級觸發器,在更新學生資訊後列印helloworld
--建立觸發器
create or replace trigger update_std_trigger
--在什麼時候觸發
after update
--觸發事件
on student
--觸發器頻率若為空則是語句級
for each row
--觸發器本體
begin
dbms_output.put_line('更新學生觸發器');
end ;
- 10
- 11
- 12
這樣在更新學生時就會列印‘更新學生觸發器’
-
old和new
當觸發器被觸發時,要使用被插入、更新或删除的記錄中的列值,有時要使用操作前、 後列的值,:old表示操作前的值,:new表示操作後的值
- 例2:建立觸發器在更新學生,年齡加一時輸出更新前的年齡和更新後的年齡
--建立觸發器
create or replace trigger update_std_trigger2
--在什麼時候觸發
after update
--觸發事件
on student
--觸發器頻率若為空則是語句級
for each row
--觸發器本體
begin
dbms_output.put_line('更新前年齡:'||:old.age||' 更新後年齡:'||:new.age);
end ;
觸發器的執行次序
- 執行 BEFORE語句級觸發器;
- 對與受語句影響的每一行:
- 執行 BEFORE行級觸發器
- 執行 DML語句
- 執行 AFTER行級觸發器
- 執行 AFTER語句級觸發器
删除、打開、關閉觸發器
- 删除觸發器
DROP TRIGGER trigger_name;
- 關閉觸發器
ALTER TIGGER trigger_name DISABLE;
- 打開觸發器
ALTER TIGGER trigger_name ENABLE ;