欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

ORACLE數據庫觸發器

系統 1865 0

ORACLE觸發器其實是PL/SQL塊,它類似于存儲過程和函數,不過有一點不同的是,觸發器是隱式調用的,并不能接收參數. ORACLE觸發器有三種類型,分別是:DML觸發器, 替代觸發器和系統觸發器. 下面對這三種類型一一進行講述

1.DML觸發器

顧名思義,DML觸發器是由DML語句觸發的.例如數據庫的INSERT/UPDATE/DELETE操作都可以觸發該類型的觸發器. 它們可以在這些語句之前或之后觸發,或者在行級上觸發(就是說對于每個受影響的行都觸發一次)

例如我們有一張表TABLE1 ,總共有三個字段ID,姓名,年齡 ,當我們在插入時希望ID可以自動生成,那么可以建立一個觸發器

CREATEORREPLACETRIGGERTR_INSERT_ID

BEFOREINSERTONTABLE1

BEGIN

SELECTT.NEXTVALINTO:NEW.IDFROMDUAL;

END;

那么當我們插入該表的時候,ID字段會自動填充.

2.替代觸發器

替代觸發器只能使用在視圖上,與DML不同的是,DML觸發器是運行在DML之外的,而替代觸發器是代替激發它的DML語句運行.替代觸發器是行級,舉個例子,這里有個視圖:

--例子來源insteadOf.sql

CREATEORREPLACEVIEWclasses_roomsAS
SELECTdepartment,course,building,room_numbe
FROMrooms,classes
WHERErooms.room_id
= classes.room_id;

直接對視圖進行插入操作非法的.因為插入操作要求對兩個表都進行修改,例如

--例子來源insteadOf.sql

如果使用替代

INSERTINTOclasses_rooms(department,course,building,
room_number)
2 VALUES( ' MUS ' , 100 , ' MusicBuilding ' , 200 );
INSERTINTOclasses_rooms(department,course,building,room_number)
*
ERRORatline
1 :
ORA
- 01732 :datamanipulationoperationnotlegalon this view

觸發器,那么就可以解決這個問題:

CREATETRIGGERClassesRoomsInsert
INSTEADOFINSERTONclasses_rooms
DECLARE
v_roomIDrooms.room_id
% TYPE;
BEGIN
-- FirstdeterminetheroomID
SELECTroom_id
INTOv_roomID
FROMrooms
WHEREbuilding
= : new .building
ANDroom_number
= : new .room_number;
-- Andnowupdatethe class
UPDATECLASSES
SETroom_id
= v_roomID
WHEREdepartment
= : new .department
ANDcourse
= : new .course;
ENDClassesRoomsInsert;

該觸發器就可以正常工作了

3.系統觸發器

這種觸發器是發生在如數據庫啟動或關閉等系統事件時,不是在執行DML語句時發生,當然也可以在DDL時觸發.

不管是以上三種的哪一種,創建的語法都是一致的.

CREATE[ORREPLACE]TRIGGERtrigger_name
... {BEFORE | AFTER | INSTEADOF} triggering_event
referencing_clause
[WHENtrigger_condition]
[FOREACHROW]
trigger_body;

其中,t r i g g e r _ n a m e是觸發器的名稱,t r i g g e r i n g _ e v e n t說明了激發觸發器的事件(也可能包
括特殊的表或視圖),t r i g g e r _ b o d y是觸發器的代碼。r e f e r e n c i n g _ c l a u s e用來引用正在處于修改狀
態下的行中的數據,如果在 W H E N子句中指定t r i g g e r _ c o n d i t i o n的話,則首先對該條件求值。觸
發器主體只有在該條件為真值時才運行.

因為DML觸發器對我們開發人員來說是最常用的,所以這里首先詳細對DML觸發器進行詳細講解:

DML觸發器是由數據庫的INSERT/UPDATE/DELETE操作觸發.該類觸發器可以在上述語句之前或之后執行,也可以每個受影響的行執行一次,所以這些條件組合,那么可以組合出12種類型的DML觸發器.這里有一個表給出了DML觸發

表6-1 DML觸發器類型
類 別 值 說 明
語句 I N S E RT、D E L E T E、 定義何種D M L語句激發觸發器
U P D AT E
定時 之前或之后 定義觸發器是在語句運行前或運行后激發
級 行或語句 如果觸發器是行級觸發器,該觸發器就對由觸發語句變更的
每一行激發一次。如果觸發器是語句級的觸發器,則該觸發
器就在語句之前或之后激發一次。行級觸發器是按觸發器定
義中的FOR EACH ROW子句表示的

需要注意的一點是:觸發器是與觸發該類型的語句一起作為一個失誤來運行的.

觸發器是在D M L語句運行時激發的,如果有多個觸發器,執行的順序如下:
1) 如果有語句之前級觸發器的話,先運行該觸發器
2) 對于受語句影響每一行:
a. 如果有行之前級觸發器的話,運行該觸發器。
b. 執行該語句本身。
c. 如果有行之后級觸發器的話,運行該觸發器。
3) 如果有語句之后級觸發器的話,運行該觸發器

并且對于行級觸發器,可以通過:NEW和:OLD標志來訪問正在處理中的行數據. 對于DML觸發器,這兩個標志符的意義如下:

觸發語句 標識符: o l d 標識符: n e w
I N S E RT 無定義-所有字段為空N U L L 該語句結束時將插入的值
U P D A E 更新前行的原始值 該語句結束時將更新的值
D E L E T E 行刪除前的原始值 無定義-所有字段為空N U L L

注意 標識符 : o l d對I N S E RT語句無定義,而標識符 : n e w對D E L E T E語句無定義。
P L / S Q L編譯器不會對在I N S E RT語句中使用的: o l d和在D E L E T E語句中使用的: n e w標識
符報錯,編譯的結果將使該字段為空。同時,我們不能在行級觸發器之后改變 : n e w,其原因是該語句已被處理了。總的來說,對: n e w的修改只能在行級觸發器之前修改。:o l d具有只讀屬性,只能讀入。

n e w和: o l d只在行級觸發器內部合法。如果企圖引用在語句級觸發器之內的: n e w
或: o l d的話,編譯器將報錯。由于語句級的觸發器只運行一次,即使存在很多被語句處理過的行
的話,n e w和: o l d也沒有定義。編譯器不知道該引用那一行

WHEN子句
W H E N子句只適用于行級觸發器。如果使用該子句的話,觸發器體將只對滿足由 W H E N子
句說明的條件的行執行。W H E N子句的語法是:
WHEN trigger_condition
其中,t r i g g e r _ c o n d i t i o n是邏輯表達式。該表達式將為每行求值。 : n e w和:o l d記錄可以在
t r i g g e r _ c o n d i t i o n內部引用,但不需使用冒號。該冒號只在觸發器體內有效。例如,觸發器
C h e c k C r e d i t s的體只在當前的學生得到的學分超出2 0時才運行:
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;

觸發器謂語:I N S E RT I N G、U P D AT I N G和D E L E T I N G
觸發器的內部(為不同的 D M L語句激發的觸發器)有三個可用來確認執行何種操作的邏輯表
達式。這些表達式的謂語是 I N S E RT I N G、U P D AT I N G、D E L E T I N G。下面說明了每個謂詞的
含義。
表達式謂語 狀 態
I N S E RT I N G 如果觸發語句是I N S E RT的話,則為真值(T R U E),否則為FA L S E
U P D AT I N G 如果觸發語句是U P D AT E的話,則為真值(T R U E),否則為FA L S E
D E L E T I N G 如果觸發語句是D E L E T E的話,則為真值(T R U E),否則為FA L S E

ORACLE數據庫觸發器


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久精品国产欧美成人 | 日本在线精品 | 日韩中文一区二区三区 | 久久99综合国产精品亚洲首页 | 国产欧美在线视频 | 亚洲高清免费观看 | 苏晓晖个人简介军衔 | 狠狠五月深爱婷婷网免费 | www.91p| 亚洲视频免费在线播放 | 免费看特黄特黄欧美大片 | 国产一级大片在线观看 | 国产成久久免费精品AV片天堂 | 日本精品中文字幕有码 | 午夜视频久久 | 另类婷婷| 中文字幕日韩精品在线 | 成人免费体验区福利云点播 | 欧美八区 | 99riav1国产精品视频 | 新封神榜杨戬电影免费动画在线观看国语 | 国产精品不卡 | 国产精品久久嫩一区二区免费 | 国内精品免费视频 | 国产精品婷婷 | 一级女性黄色生活片 | 99草在线观看 | 成人自拍视频网 | 香港午夜三级a三级高清观看 | 91免费看片 | 男女全黄做爰视频免费看 | 久久97久久97精品免视看 | 亚洲精品久久久 | 国内精品免费一区二区观看 | 日韩视频免费 | 日韩五码在线 | 日日摸日日添夜夜爽97 | 伊人亚洲| 亚洲五月 | 国产精品网址 | 国产精品久久久久久中文字 |