程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> oracle各種觸發器和使用規則

oracle各種觸發器和使用規則

編輯:Oracle數據庫基礎
 

觸發器是當特定事件出現時自動執行的代碼塊.觸發器與過程的區別在於:過程是由用戶或應用程序顯式調用的,而觸發器是不能被直接調用的.
觸發器能夠執行的功能有:
1.自動生成數據.
2.強制復雜的完整性約束條件.
3.自定義復雜的安全權限.
4.提供審計和日志記錄.
5.啟用復雜的業務邏輯.


觸發器的類型有:


1>行級觸發器.(行級觸發器對DML語句影響的每個行執行一次)
實例一:
--觸發器
--行級觸發器
create table test(sid number,sname varchar2(20));--創建一個表
create sequence seq_test;--創建序列
create or replace trigger tri_test--創建觸發器
before insert or update of sid
on test
for each row--觸發每一行
begin
if inserting then
select seq_test.nextval into:new.sid from dual;
else
raise_application_error(-20020,'不允許更新ID值!');--中斷程序
end if;
end;

--測試,插入幾條記錄
insert into test values(0,'ff');
insert into test values(0,'ff');
insert into test values(0,'tt');

輸出結果如下圖所示:



實例二:
--創建一個觸發器,無論用戶插入新記錄,還是修改emp表的job列,都將用戶指定的job列的值轉換成大寫.

create or replace trigger trig_job
before insert or update of job
on emp
for each row
begin
if inserting then
:new.job:=upper(:new.job);
else
:new.job:=upper(:new.job);
end if;
end;


2>語句級觸發器.(語句級觸發器對每個DML語句執行一次)
實例:
create or replace trigger tri_test
after insert or update or delete
on test
begin
if updating then
dbms_output.put_line('修改');
elsif deleting then
dbms_output.put_line('刪除');
elsif inserting then
dbms_output.put_line('插入');
end if;
end;


3>instead of 觸發器.(此觸發器是在視圖上而不是在表上定義的觸發器,它是用來替換所使用實際語句的觸發器.)
語法如下:
create or replace trigger trig_test
instead of insert or update on 表名
referencing new as n
for each row
declare
..........
begin
........
end;


4>模式觸發器.
可以在模式級的操作上建立觸發器.
實例如下:
create or replace trigger log_drop_obj
after drop on schema
begin
insert into .....
end;


5>數據庫級觸發器.
可以創建在數據庫存事件上的觸發器,包括關閉,啟動,服務器錯誤,登錄等.這些事件都是實例范圍的,不與特定的表或視圖關聯.
實例:
create or replace trigger trig_name
after startup on database
begin
...........
end;

----------------------------------------------------------------------------------------------
創建觸發器:
    CREATE [OR REPLACE] TRIGGER <觸發器名>
    BEFORE|AFTER
    INSERT|DELETE|UPDATE [OF <列名>] ON <表名>
    [FOR EACH ROW]
     WHEN (<條件>)
     <pl/sql塊>

     關鍵字"BEFORE"在操作完成前觸發;"AFTER"則是在操作完成後觸發;
     關鍵字"FOR EACH ROW"指定觸發器每行觸發一次.
     關鍵字"OF <列名>" 不寫表示對整個表的所有列.
     WHEN (<條件>)表達式的值必須為"TRUE".

特殊變量:
     :new --為一個引用最新的列值;
     :old --為一個引用以前的列值;

這些變量只有在使用了關鍵字 "FOR EACH ROW"時才存在.且update語句兩個都有,而insert只有:new ,delect 只有:old;

使用RAISE_APPLICATION_ERROR
     語法:RAISE_APPLICATION_ERROR(錯誤號(-20000到-20999),消息[,{true|false}]);
     拋出用戶自定義錯誤.
     如果參數為'TRUE',則錯誤放在先前的堆棧上.

INSTEAD OF 觸發器
     INSTEAD OF 觸發器主要針對視圖(VIEW)將觸發的dml語句替換成為觸發器中的執行語句,而不執行dml語句.


禁用某個觸發器
     ALTER TRIGGER <觸發器名> DISABLE
重新啟用觸發器
     ALTER TRIGGER <觸發器名> ENABLE
禁用所有觸發器
     ALTER TRIGGER <觸發器名> DISABLE ALL TRIGGERS
啟用所有觸發器
     ALTER TRIGGER <觸發器名> ENABLE ALL TRIGGERS
刪除觸發器
     DROP TRIGGER <觸發器名>

---------------------------------------------------------------------------------------------

1.觸發器的創建規則:
①作用范圍清晰;
②不要讓觸發器去完成Oracle後台已經能夠完成的功能;
③限制觸發器代碼的行數;
④不要創建遞歸的觸發器;
⑤觸發器僅在被觸發語句觸發時進行集中的,全局的操作,同用戶和數據庫應用無關。

2.可以創建被如下語句所觸發的觸發器:
①DML語句(DELETE,INSERT,UPDATE);
②DDL語句(CREATE,ALTER, DROP);
③數據庫操作(SERVERERROR,LOGON,LOGOFF,STARTUP,SHUTDOWN)。

3.注意事項
①觸發器可以聲明為在對記錄進行操作之前,在之前(檢查約束之前和 INSERT,UPDATE 或 DELETE 執行前)或之後(在檢查約束之後和完成 INSERT, UPDATE 或 DELETE 操作)觸發;
②一個 FOR EACH ROW 執行指定操作的觸發器為操作修改的每一行都調用一次;
③SELECT 並不更改任何行,因此不能創建 SELECT 觸發器.這種場合下規則和視圖更適合;
④觸發器和某一指定的表格有關,當該表格備刪除時,任何與該表有關的觸發器同樣會被刪除;
⑤在一個表上的每一個動作只能有一個觸發器與之關聯;
⑥在一個單獨的表上,最多只能創建三個觸發器與之關聯,一個INSERT觸發器,一個DELETE觸發器和一個UPDATE觸發器;

4.刪除觸發器的語句格式為:

DROP TRIGGER name ON table;
一個觸發器由三部分組成:觸發事件或語句、觸發限制和觸發器動作。觸發事件或語句是指引起激發觸發器的SQL語句,可為對一指定表的INSERT、UNPDATE或DELETE語句。觸發限制是指定一個布爾表達式,當觸發器激發時該布爾表達式是必須為真。觸發器作為過程,是PL/SQL塊,當觸發語句發出、觸發限制計算為真時該過程被執行。  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved