ORACLE觸發(fā)器其實(shí)是PL/SQL塊,它類似于存儲(chǔ)過(guò)程和函數(shù),不過(guò)有一點(diǎn)不同的是,觸發(fā)器是隱式調(diào)用的,并不能接收參數(shù). ORACLE觸發(fā)器有三種類型,分別是:DML觸發(fā)器, 替代觸發(fā)器和系統(tǒng)觸發(fā)器. 下面對(duì)這三種類型一一進(jìn)行講述
1.DML觸發(fā)器
顧名思義,DML觸發(fā)器是由DML語(yǔ)句觸發(fā)的.例如數(shù)據(jù)庫(kù)的INSERT/UPDATE/DELETE操作都可以觸發(fā)該類型的觸發(fā)器. 它們可以在這些語(yǔ)句之前或之后觸發(fā),或者在行級(jí)上觸發(fā)(就是說(shuō)對(duì)于每個(gè)受影響的行都觸發(fā)一次)
例如我們有一張表TABLE1 ,總共有三個(gè)字段ID,姓名,年齡 ,當(dāng)我們?cè)诓迦霑r(shí)希望ID可以自動(dòng)生成,那么可以建立一個(gè)觸發(fā)器










那么當(dāng)我們插入該表的時(shí)候,ID字段會(huì)自動(dòng)填充.
2.替代觸發(fā)器
替代觸發(fā)器只能使用在視圖上,與DML不同的是,DML觸發(fā)器是運(yùn)行在DML之外的,而替代觸發(fā)器是代替激發(fā)它的DML語(yǔ)句運(yùn)行.替代觸發(fā)器是行級(jí),舉個(gè)例子,這里有個(gè)視圖:
--例子來(lái)源insteadOf.sql




直接對(duì)視圖進(jìn)行插入操作非法的.因?yàn)椴迦氩僮饕髮?duì)兩個(gè)表都進(jìn)行修改,例如
--例子來(lái)源insteadOf.sql
如果使用替代







觸發(fā)器,那么就可以解決這個(gè)問(wèn)題:

















該觸發(fā)器就可以正常工作了
3.系統(tǒng)觸發(fā)器
這種觸發(fā)器是發(fā)生在如數(shù)據(jù)庫(kù)啟動(dòng)或關(guān)閉等系統(tǒng)事件時(shí),不是在執(zhí)行DML語(yǔ)句時(shí)發(fā)生,當(dāng)然也可以在DDL時(shí)觸發(fā).
不管是以上三種的哪一種,創(chuàng)建的語(yǔ)法都是一致的.






其中,t r i g g e r _ n a m e是觸發(fā)器的名稱,t r i g g e r i n g _ e v e n t說(shuō)明了激發(fā)觸發(fā)器的事件(也可能包
括特殊的表或視圖),t r i g g e r _ b o d y是觸發(fā)器的代碼。r e f e r e n c i n g _ c l a u s e用來(lái)引用正在處于修改狀
態(tài)下的行中的數(shù)據(jù),如果在 W H E N子句中指定t r i g g e r _ c o n d i t i o n的話,則首先對(duì)該條件求值。觸
發(fā)器主體只有在該條件為真值時(shí)才運(yùn)行.
因?yàn)镈ML觸發(fā)器對(duì)我們開(kāi)發(fā)人員來(lái)說(shuō)是最常用的,所以這里首先詳細(xì)對(duì)DML觸發(fā)器進(jìn)行詳細(xì)講解:
DML觸發(fā)器是由數(shù)據(jù)庫(kù)的INSERT/UPDATE/DELETE操作觸發(fā).該類觸發(fā)器可以在上述語(yǔ)句之前或之后執(zhí)行,也可以每個(gè)受影響的行執(zhí)行一次,所以這些條件組合,那么可以組合出12種類型的DML觸發(fā)器.這里有一個(gè)表給出了DML觸發(fā)
表6-1 DML觸發(fā)器類型
類 別 值 說(shuō) 明
語(yǔ)句 I N S E RT、D E L E T E、 定義何種D M L語(yǔ)句激發(fā)觸發(fā)器
U P D AT E
定時(shí) 之前或之后 定義觸發(fā)器是在語(yǔ)句運(yùn)行前或運(yùn)行后激發(fā)
級(jí) 行或語(yǔ)句 如果觸發(fā)器是行級(jí)觸發(fā)器,該觸發(fā)器就對(duì)由觸發(fā)語(yǔ)句變更的
每一行激發(fā)一次。如果觸發(fā)器是語(yǔ)句級(jí)的觸發(fā)器,則該觸發(fā)
器就在語(yǔ)句之前或之后激發(fā)一次。行級(jí)觸發(fā)器是按觸發(fā)器定
義中的FOR EACH ROW子句表示的
需要注意的一點(diǎn)是:觸發(fā)器是與觸發(fā)該類型的語(yǔ)句一起作為一個(gè)失誤來(lái)運(yùn)行的.
觸發(fā)器是在D M L語(yǔ)句運(yùn)行時(shí)激發(fā)的,如果有多個(gè)觸發(fā)器,執(zhí)行的順序如下:
1) 如果有語(yǔ)句之前級(jí)觸發(fā)器的話,先運(yùn)行該觸發(fā)器
2) 對(duì)于受語(yǔ)句影響每一行:
a. 如果有行之前級(jí)觸發(fā)器的話,運(yùn)行該觸發(fā)器。
b. 執(zhí)行該語(yǔ)句本身。
c. 如果有行之后級(jí)觸發(fā)器的話,運(yùn)行該觸發(fā)器。
3) 如果有語(yǔ)句之后級(jí)觸發(fā)器的話,運(yùn)行該觸發(fā)器
并且對(duì)于行級(jí)觸發(fā)器,可以通過(guò):NEW和:OLD標(biāo)志來(lái)訪問(wèn)正在處理中的行數(shù)據(jù). 對(duì)于DML觸發(fā)器,這兩個(gè)標(biāo)志符的意義如下:
觸發(fā)語(yǔ)句 標(biāo)識(shí)符: o l d 標(biāo)識(shí)符: n e w
I N S E RT 無(wú)定義-所有字段為空N U L L 該語(yǔ)句結(jié)束時(shí)將插入的值
U P D A E 更新前行的原始值 該語(yǔ)句結(jié)束時(shí)將更新的值
D E L E T E 行刪除前的原始值 無(wú)定義-所有字段為空N U L L
注意 標(biāo)識(shí)符 : o l d對(duì)I N S E RT語(yǔ)句無(wú)定義,而標(biāo)識(shí)符 : n e w對(duì)D E L E T E語(yǔ)句無(wú)定義。
P L / S Q L編譯器不會(huì)對(duì)在I N S E RT語(yǔ)句中使用的: o l d和在D E L E T E語(yǔ)句中使用的: n e w標(biāo)識(shí)
符報(bào)錯(cuò),編譯的結(jié)果將使該字段為空。同時(shí),我們不能在行級(jí)觸發(fā)器之后改變 : n e w,其原因是該語(yǔ)句已被處理了。總的來(lái)說(shuō),對(duì): n e w的修改只能在行級(jí)觸發(fā)器之前修改。:o l d具有只讀屬性,只能讀入。
n e w和: o l d只在行級(jí)觸發(fā)器內(nèi)部合法。如果企圖引用在語(yǔ)句級(jí)觸發(fā)器之內(nèi)的: n e w
或: o l d的話,編譯器將報(bào)錯(cuò)。由于語(yǔ)句級(jí)的觸發(fā)器只運(yùn)行一次,即使存在很多被語(yǔ)句處理過(guò)的行
的話,n e w和: o l d也沒(méi)有定義。編譯器不知道該引用那一行
WHEN子句
W H E N子句只適用于行級(jí)觸發(fā)器。如果使用該子句的話,觸發(fā)器體將只對(duì)滿足由 W H E N子
句說(shuō)明的條件的行執(zhí)行。W H E N子句的語(yǔ)法是:
WHEN trigger_condition
其中,t r i g g e r _ c o n d i t i o n是邏輯表達(dá)式。該表達(dá)式將為每行求值。 : n e w和:o l d記錄可以在
t r i g g e r _ c o n d i t i o n內(nèi)部引用,但不需使用冒號(hào)。該冒號(hào)只在觸發(fā)器體內(nèi)有效。例如,觸發(fā)器
C h e c k C r e d i t s的體只在當(dāng)前的學(xué)生得到的學(xué)分超出2 0時(shí)才運(yùn)行:
CREATE OR REPLACE TRIGGER CheckCredits
BEFORE INSERT OR UPDATE OF current_credits ON students
FOR EACH ROW
WHEN (new.current_credits > 20)
BEGIN
/* Trigger body goes here. */
END;
觸發(fā)器謂語(yǔ):I N S E RT I N G、U P D AT I N G和D E L E T I N G
觸發(fā)器的內(nèi)部(為不同的 D M L語(yǔ)句激發(fā)的觸發(fā)器)有三個(gè)可用來(lái)確認(rèn)執(zhí)行何種操作的邏輯表
達(dá)式。這些表達(dá)式的謂語(yǔ)是 I N S E RT I N G、U P D AT I N G、D E L E T I N G。下面說(shuō)明了每個(gè)謂詞的
含義。
表達(dá)式謂語(yǔ) 狀 態(tài)
I N S E RT I N G 如果觸發(fā)語(yǔ)句是I N S E RT的話,則為真值(T R U E),否則為FA L S E
U P D AT I N G 如果觸發(fā)語(yǔ)句是U P D AT E的話,則為真值(T R U E),否則為FA L S E
D E L E T I N G 如果觸發(fā)語(yǔ)句是D E L E T E的話,則為真值(T R U E),否則為FA L S E
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
