觸發器
一.簡介
觸發器是由 PL/SQL 或 Java 編寫的過程[procedure],當表或視圖被修改或發生使用者操作[user action]或資料庫系統操作[database system action]時被觸發運行[fire]。
當以下操作發生時,觸發器[trigger]被觸發運行:
· 使用者提交了針對特定表或視圖的 DML 語句(INSERT,UPDATE,DELETE)
· 特定的方案[schema]/使用者或資料庫內任意方案/使用者提交了 DDL 語句(主要指 CREATE 及 ALTER)
· 特定的方案/使用者或資料庫內任意方案/使用者提交的資料庫事件[event],例如登入/退出[logon/logoff],錯誤[error],或啟動/關閉[startup/shutdown]
觸發器與預存程序[stored procedure]類似。資料庫觸發器內可以包含 Java 語句,或 SQL 語句及 PL/SQL 結構,也可以調用其他預存程序。觸發器與預存程序的區別在於她們的調用方式不同。預存程序是由使用者,應用程式或觸發器顯式地調用的。而觸發器是在觸發事件[triggering event]發生時由 Oracle 隱式地觸發的,觸發器的運行與串連到資料庫的使用者及使用者使用的是何種應用程式無關。
能夠導致觸發器被調用的事件包括:
· 修改表資料的 DML 語句(INSERT,UPDATE,或 DELETE)
· DDL 語句
· 啟動[startup],關閉[shutdown]或錯誤訊息[error message]等系統事件[system event]
· 登入[logon]及退出[logoff]等使用者事件[user
二.觸發器組成:
一個觸發器[trigger]包含 3 個基本組成部分:
· 觸發事件[triggering event]或觸發語句[triggering statement]
· 觸發限制條件[trigger restriction]
· 觸發操作[trigger action]
三. 觸發器的類型
1、 語句觸發器
2、 行觸發器
3、INSTEAD OF觸發
4、 系統條件觸發器
5、 使用者事件觸發程序
四. 觸發器的觸發次序
1.執行before層級的語句
2.對與受語句影響的每一行
Before行級/執行DML語句/執行after行級觸發
3.執行after語句觸發
五.注意
1.觸發器不接受參數。
2.一個表上最多可有12個觸發器,但同一時間、同一事件、同一類型的觸發器只能有一個。並各觸發器之間不能有矛盾。
3.在一個表上的觸發器越多,對在該表上的DML操作的效能影響就越大。
4.觸發器最大為32KB。若確實需要,可以先建立過程,然後在觸發器中用CALL語句進行調用。
5.在觸發器的執行部分只能用DML語句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL語句(CREATE、ALTER、DROP)。
6.觸發器中不能包含事務控制語句(COMMIT,ROLLBACK,SAVEPOINT)。因為觸發器是觸發語句的一部分,觸發語句被提交、回退時,觸發器也被提交、回退了。
7.在觸發器主體中調用的任何過程、函數,都不能使用事務控制語句。
8.在觸發器主體中不能申明任何Long和blob變數。新值new和舊值old也不能向表中的任何long和blob列。
9.不同類型的觸發器(如DML觸發器、INSTEAD OF觸發器、系統觸發器)的文法格式和作用有較大區別
六.DML觸發器的限制
1.CREATE TRIGGER語句文本的字元長度不能超過32KB;
2.觸發器體內的SELECT 語句只能為SELECT … INTO …結構,或者為定義遊標所使用的SELECT 語句。
3.觸發器中不能使用資料庫事務控制語句 COMMIT; ROLLBACK, SVAEPOINT 語句;
4.由觸發器所調用的過程或函數也不能使用資料庫事務控制語句;
5.觸發器中不能使用LONG, LONG RAW 類型;
6.觸發器內可以參照LOB 類型列的列值,但不能通過 :NEW 修改LOB列中的資料;
ALTER TIGGER trigger_name DISABLE | ENABLE ;可用不可用
七.兩個demo及詳解
----1.行觸發
create or replace trigger biufer_abook_BOOKNAME ---建立
before insert or update or delete ----在ddm之前
of BOOKMADE ---列名
on abook ----表名
referencing old as old_value new as new_value
for each row ----行觸發
when (new_value.bookmade <> '新華' and new_value.bookmade <> '人民')
begin
:new_value.BOOKMADE := '新華';
end;
---2.語句觸發
create or replace trigger biufer_abook_after
after insert or update or delete of bookname on abook
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 biuger_view_name
instead of insert or update on view_name
referencing new as n
for each row
declare
..........
begin
........
end;
-----4.模式觸發器.可以在模式級的操作上建立觸發器
create or replace trigger biuger_schema
after drop on schema
begin
insert into .....
end;
------5.資料庫級觸發器.不與特定的表或視圖關聯.
create or replace trigger trig_name
after startup on database
begin
...........
end;
DML觸發器的限制
1.CREATE TRIGGER語句文本的字元長度不能超過32KB;
2.觸發器體內的SELECT 語句只能為SELECT … INTO …結構,或者為定義遊標所使用的SELECT 語句。
3.觸發器中不能使用資料庫事務控制語句 COMMIT; ROLLBACK, SVAEPOINT 語句;
4.由觸發器所調用的過程或函數也不能使用資料庫事務控制語句;
5.觸發器中不能使用LONG, LONG RAW 類型;
6.觸發器內可以參照LOB 類型列的列值,但不能通過 :NEW 修改LOB列中的資料;