oracle文檔第九章觸發器(1)
2024-08-29 13:53:46
供稿:網友
第九章節 :觸發器編碼
觸發器是存儲在數據庫存中隱式的運行或者被觸發的一段程序,當某些事件發生。通常情況下,觸發器中支持可執行的一段pl/sql代碼塊,當一個insert,update,或者delete命名發生在一個表或者視圖上的時候。其也支持系統和數據庫或者方案事件.Oracle數據庫也支持觸發器中含有可執行的pl/sql或java程序.
該章節討論dml觸發器,instead of 觸發器和系統觸發器(數據庫/方案觸發器),內容如下:
設計觸發器
創建觸發器
觸發器核心代碼
編譯觸發器
修改已有的觸發器
(enabling and disabling triggers)使用和[disabling]角發器
查看觸發器相關的信息
觸發器實例代碼
用觸發器響應[responding]系統事件
9.1設計觸發器
在設計觸發器時,使用下列設計原則
觸發器用來保證當一個特定的操作被執行時,和該操作相關的動作也被執行。
當一個重復[duplicate]功能在數據庫中存在,此時要避免使用觸發器。例如,如果能用數據完敕性約束來實現維不合法的數據存儲到數據庫時,就沒有必要使用觸發器來實現相同的功能。[refect]拒絕
限制觸發器程序代碼的大小,如果觸發器的實現邏輯需要超過60行代碼,那么最好把大量的代碼存儲在一個存儲過程中,然后在觸發器中調用該存儲過程。
regardless of[無論] 無論是用戶或者數據庫[issues]觸發器事件,觸發器是僅僅用來[centralized]集中公共的操作被調用。
不要創建[recursive]遞歸性的觸發器。如,創建一個在Emp_tab after update語名的觸發器,在該表中又定義了一個update 語句,使該觸發器遞補歸的被調用直到內存溢出。
要明知[judiciously]的用觸發器,它在每個用戶,任何時間被執行,當事件發生在已經定義好的觸發器上.
9.2創建觸發器
可以使用任何[interactive]互相交互的工具,如sql*plus 或enterPRise manager,用CREATE TRIGGER statement命令來創建.在使用交互工具編寫完觸發器時,在程序末尾加上('/')字符是[necessary]必要的,來使剛創建的觸發器激活[activate]。
如下命令在emp_tab表上創建一個觸發器:
CREATE OR REPLACE TRIGGER Print_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab
FOR EACH ROW
WHEN (new.Empno > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :new.sal - :old.sal;
dbms_output.put('Old salary: ' || :old.sal);
dbms_output.put(' New salary: ' || :new.sal);
dbms_output.put_line(' Difference ' || sal_diff);
END;
/
當dml操作(insert,update,delete 命令)在該表上時,該觸發器被觸發,你可以選擇組合方式觸發事件來觸發它。
因為該觸發器用了BEFOR關鍵字,它能在新值存儲表之間可以訪問新值或如果新值被表示有簡單的錯誤時,還能修改新值。
如果你想讓觸發器查詢或修改同樣表的數據時,可以用AFTER關鍵字。because triggers can only do that after the initial changes are applied and the table is back in a consistent state.
因為該觸發器用了FOR EACH ROW 從句,這可以被執行多次,如當更新或刪除多個行時.如你僅僅想記錄發生操作的the face,就可以[omit] 省略for each row關鍵字,但是不使用該數據為每行記錄.
一但,觸發器被創建,輸入下面sql命令
UPDATE Emp_tab SET sal = sal + 500.00 WHERE deptno = 10;當該觸發器一但被觸發,每行被更新,在打印從句,打印新的薪水,以前薪水,和它們之間的不同.如果在pl/sql塊中存在任何錯誤,create(或create或replace)命令執行失敗. 注:觸發器程序代碼的大小不能超過32kb;
下面部分使用實例來[illustrate]說明觸發器部分使用方法
看其它:
"Examples of Trigger applications" for more realistic examples of CREATE TRIGGER statements
9.2.1 觸發器類型
觸發器可以包含pl/sql塊,或一個pl/sql,c或java程序和表,視圖,方案或數據庫自身關聯.
當一個特殊事件發生,Oracle數據自動執行觸發器,[ which may be in the form of a system event or a DML statement being issued against the table.]
觸發器作用對象:
l Dml觸發器作用在表
l Instead of 觸發器可以作用在視圖
l System 觸發器作用在數據庫/方案.用database,觸發器觸發每個事件為所有用戶,用Schem,觸發器被特定的用戶觸發
See also:
Oracle Database SQL Reference for information on trigger creation syntax
9.2.2 系統事件
你可以創建下列任何事件來觸發的觸發器