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