天天看點

pl/sql操作資料庫之觸發器的使用pl/sql操作資料庫之觸發器的使用 什麼是觸發器? 觸發器的類型 觸發器的建立 觸發器的執行次序 删除、打開、關閉觸發器

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系統的啟動與關閉等。
  • 觸發器的組成:
    1. 觸發事件:即在何種情況下觸發TRIGGER; 例如:INSERT, UPDATE, DELETE。
    2. 觸發時間:即該TRIGGER 是在觸發事件發生之前(BEFORE)還是之後(AFTER)觸發,也就是觸發事件和該TRIGGER 的操作順序。
    3. 觸發器本身:即該TRIGGER 被觸發之後的目的和意圖,正是觸發器本身要做的事情。 例如:PL/SQL 塊。
    4. 觸發頻率:說明觸發器内定義的動作被執行的次數。即語句級(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 ;           

觸發器的執行次序

  1. 執行 BEFORE語句級觸發器;
  2. 對與受語句影響的每一行: 
    • 執行 BEFORE行級觸發器
    • 執行 DML語句
    • 執行 AFTER行級觸發器
  3. 執行 AFTER語句級觸發器

删除、打開、關閉觸發器

  • 删除觸發器
DROP TRIGGER trigger_name;           
  • 關閉觸發器
ALTER TIGGER trigger_name DISABLE;           
  • 打開觸發器
ALTER TIGGER trigger_name ENABLE ;