版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
善知堂()第十三章觸發(fā)器善知堂()知識(shí)回顧Refcursor
派生refcursor類型數(shù)據(jù)包 數(shù)據(jù)包說(shuō)明數(shù)據(jù)包主體調(diào)用數(shù)據(jù)包中的方法和類型善知堂()觸發(fā)器類型
DML觸發(fā)器Insteadof觸發(fā)器系統(tǒng)觸發(fā)器善知堂()內(nèi)容摘要觸發(fā)器的類型創(chuàng)建觸發(fā)器善知堂()創(chuàng)建觸發(fā)器的語(yǔ)法CREATE[ORREPLACE]TRIGGERtrigger_name{BEFORE|AFTER|INSTEADOF}triggering_eventreferencing_clause[WHENtrigger_condition][FOREACHROW]trigger_body;
其中,trigger_name是觸發(fā)器的名稱,triggering_event說(shuō)明了激發(fā)觸發(fā)器的事件(也可能包括特殊的表或視圖),trigger_body是觸發(fā)器的代碼。referencing_clause用來(lái)引用正在處于修改狀態(tài)下的行中的數(shù)據(jù),如果在WHEN子句中指定trigger_condition的話,則首先對(duì)該條件求值。觸發(fā)器主體只有在該條件為真值時(shí)才運(yùn)行。我們?cè)谙旅鎺坠?jié)中將演示不同類型的觸發(fā)器案例。善知堂()Dml觸發(fā)器分類1、根據(jù)觸發(fā)事件劃分insert/update/delete2、根據(jù)觸發(fā)時(shí)間劃分before——先觸發(fā)后執(zhí)行after——先執(zhí)行后觸發(fā)3、根據(jù)觸發(fā)級(jí)別劃分語(yǔ)句級(jí):每個(gè)dml語(yǔ)句不論影響了多少行都只觸發(fā)1次記錄級(jí):針對(duì)dml語(yǔ)句影響的每個(gè)行都會(huì)觸發(fā)一次善知堂()Dml觸發(fā)器案例一要求:用戶下班時(shí)間和周末不能更改emp表分析思路:觸發(fā)事件:對(duì)emp表的update操作觸發(fā)時(shí)間:使用前觸發(fā)可以避免不必要的回滾所以選擇before觸發(fā)觸發(fā)級(jí)別:每個(gè)語(yǔ)句觸發(fā)一次就可以代碼描述:當(dāng)用戶對(duì)表進(jìn)行更改操作的時(shí)候,判斷當(dāng)前的系統(tǒng)時(shí)間,如果是周末或者下班時(shí)間就回滾或拋出異常善知堂()Dml觸發(fā)器案例二要求:用戶對(duì)emp表的sal更改量不能超過(guò)10%分析思路:觸發(fā)事件:對(duì)emp表的update操作觸發(fā)時(shí)間:使用前觸發(fā)可以避免不必要的回滾所以選擇before觸發(fā)觸發(fā)級(jí)別:因?yàn)闀?huì)影響到多行因此使用行觸發(fā),針對(duì)被更改的每一行都觸發(fā)一次代碼描述:當(dāng)用戶對(duì)表進(jìn)行更改操作的時(shí)候,根據(jù)更改后的sal(使用:new.sal)和更改前的sal(使用:old.sal),判斷更改量是否超過(guò)10%,如果超出了就拋出異常。注意:如果要使用:old和:new一定是行觸發(fā)(foreachrow)善知堂()Dml觸發(fā)器案例三要求:現(xiàn)在有兩個(gè)表,商品庫(kù)存表,商品交易表,如果交易表中插入記錄a商品進(jìn)貨10個(gè),那么a商品的庫(kù)存就增加10個(gè),如果銷(xiāo)售10個(gè),a的庫(kù)存就減少10個(gè),如果請(qǐng)求的數(shù)量超出庫(kù)存,我們就提示出錯(cuò)分析思路:觸發(fā)事件:對(duì)商品交易表的insert操作觸發(fā)時(shí)間:使用前觸發(fā)可以避免不必要的回滾所以選擇before觸發(fā)觸發(fā)級(jí)別:因?yàn)橐褂?old和:new一定是行觸發(fā)(foreachrow)代碼描述:根據(jù)插入的記錄首先判斷交易類型,如果是進(jìn)貨就更改商品庫(kù)存表把相應(yīng)商品的庫(kù)存加上進(jìn)貨數(shù)量,如果是出貨首先判斷該商品是否有足夠的庫(kù)存,如果有就更改該庫(kù)存,如果庫(kù)存不足就拋出異常。善知堂()可變更與不可變更視圖要求:現(xiàn)在有兩個(gè)表,商品庫(kù)存表,商品交易表,如果交易表中插入記錄a商品進(jìn)貨10個(gè),那么a商品的庫(kù)存就增加10個(gè),如果銷(xiāo)售10個(gè),a的庫(kù)存就減少10個(gè),如果請(qǐng)求的數(shù)量超出庫(kù)存,我們就提示出錯(cuò)分析思路:觸發(fā)事件:對(duì)商品交易表的insert操作觸發(fā)時(shí)間:使用前觸發(fā)可以避免不必要的回滾所以選擇before觸發(fā)觸發(fā)級(jí)別:因?yàn)橐褂?old和:new一定是行觸發(fā)(foreachrow)代碼描述:根據(jù)插入的記錄首先判斷交易類型,如果是進(jìn)貨就更改商品庫(kù)存表把相應(yīng)商品的庫(kù)存加上進(jìn)貨數(shù)量,如果是出貨首先判斷該商品是否有足夠的庫(kù)存,如果有就更改該庫(kù)存,如果庫(kù)存不足就拋出異常。善知堂()善知堂()善知堂()善知堂()善知堂()善知堂()善知堂()善知堂()善知堂()善知堂()替代觸發(fā)器善知堂()CreateOrReplaceTriggertrgInsertViewInsteadorInertonStuSubScoreReferencingNewNForEachRowdeclareiCountint;BeginSelectCount(*)IntoiCountFromStudentWhereStuid=:N.StuID;IfiCount=0thenInsertIntoStudent(StuID,stuName)Values(:N.StuID,:n.stuname);ElseUpdateStudentSetStudent.stuName=:N.stuNameWhereStuID=:N.StuID;Endif;SelectCount(*)IntoiCountFromSubjectWhereSubjectID=:n.SubjectID;ifiCount=0ThenInsetIntoSubjectValues(:N.SubjectID,:N.SubjectName);ElseUpdateSubjectSetSubject.SubjectName:=N.SubjectNameWhereSubjectID=:N.SubjectID;Endif;SelectCount(*)IntoiCountFromScoreWhereSubjectID=:n.SubjectIDAndstuid=n.tuid;ifiCount=0ThenInsetIntoscoreValues(:N.stuid,:N.SubjectID,:nscore);ElseUpdatescoreSetscore.score:=N.scoreWhereSubjectID=:N.SubjectIDandstuid=:n.stuid;Endif;end;/善知堂()替代觸發(fā)器可以替代我們對(duì)不可操作視圖的操作,也就是我們對(duì)不可操作試圖的dml操作都會(huì)激發(fā)觸發(fā)器而不去做其他的操作。替代觸發(fā)器案例:制作一個(gè)視圖:Createviewdeptsalasselectdeptno,sum(sal)totsalfromempgroupbydeptno;大家可以分析出來(lái)該視圖的totsal列是不能更改的,我們要寫(xiě)一個(gè)insteadof觸發(fā)器來(lái)實(shí)現(xiàn)對(duì)該視圖的更改,把用戶的更改量平均分配給每個(gè)該部門(mén)的員工。詳細(xì)代碼:參看ppt附件中的觸發(fā)器代碼善知堂()系統(tǒng)觸發(fā)器正如我們?cè)谇皫坠?jié)所看到的,DML和替代觸發(fā)器都在(或代替)DML事件,即INSERT、UPDATE、DELETE語(yǔ)句上激活。而系統(tǒng)觸發(fā)器可以在兩種不同的事件即DDL或數(shù)據(jù)庫(kù)上激活。DDL事件包括CREATE、ALTER或DROP語(yǔ)句,而數(shù)據(jù)庫(kù)事件包括服務(wù)器的啟動(dòng)或關(guān)閉,用戶的登錄或退出,以及服務(wù)器錯(cuò)誤。創(chuàng)建系統(tǒng)觸發(fā)器的語(yǔ)法如下:CREATE[ORREPLACE]TRIGGER[schema.]trigger_name{BEFORE|AFTER}{ddl_event_list|database_event_list}ON{DATABASE|[schema.]SCHEMA}[when_clause]trigger_body;
其中,ddl_event_list是一個(gè)或多個(gè)DDL事件(事件之間用OR分隔),database_event_list是一個(gè)或多個(gè)數(shù)據(jù)庫(kù)事件(事件之間用‘OR’分隔)。善知堂()系統(tǒng)觸發(fā)器級(jí)別方案級(jí) 相當(dāng)于用戶級(jí),對(duì)某一用戶的指定操作生效數(shù)據(jù)庫(kù)級(jí) 對(duì)所有用戶的操作生效善知堂()createorreplacetriggerlogtimeafterlogonondatabasebegininsertintoscott.userlogvalues(user,sysdate);endlogtime;/善知堂()系統(tǒng)觸發(fā)器案例例如,假設(shè)我們要記錄對(duì)象創(chuàng)建的時(shí)間,創(chuàng)建人,對(duì)象擁有者,對(duì)象類型和名稱,我們可以通過(guò)創(chuàng)建下面的表來(lái)實(shí)現(xiàn)上述記錄功能:CREATETABLEddl_creations(user_idVARCHAR2(30),object_typeVARCHAR2(20),object_nameVARCHAR2(30),object_ownerVARCHAR2(30),creation_dateDATE);
我們要求數(shù)據(jù)庫(kù)中的人和用戶發(fā)出create命令,我們都把這個(gè)命令創(chuàng)建的創(chuàng)建人,對(duì)象類型,對(duì)象的名稱,擁有者,創(chuàng)建日期記錄在該表中。善知堂()系統(tǒng)觸發(fā)器案例(續(xù))分析思路:觸發(fā)事件:任何用戶的create事件觸發(fā)時(shí)間:一定是創(chuàng)建成功后我們才記錄該操作因此使用after觸發(fā),先執(zhí)行創(chuàng)建語(yǔ)句后執(zhí)行觸發(fā)器觸發(fā)級(jí)別:因?yàn)橐槍?duì)任何用戶的create事件所以是數(shù)據(jù)庫(kù)級(jí)別觸發(fā)代碼描述:觸發(fā)器中只有一句insert語(yǔ)句,使用USER獲得用戶名,使用SYS.DICTIONARY_OBJ_TYPE獲得當(dāng)前創(chuàng)建
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年人工智能算法及應(yīng)用案例試題集
- 2026年金融分析師投資風(fēng)險(xiǎn)評(píng)估與應(yīng)對(duì)操作實(shí)務(wù)題庫(kù)
- 2026年文學(xué)鑒賞與文學(xué)理論專業(yè)考試題目含文學(xué)評(píng)論
- 2026年智能建筑技術(shù)與應(yīng)用專業(yè)試題
- 2026年英語(yǔ)教育專業(yè)教師資格中級(jí)模擬卷
- 2026年經(jīng)濟(jì)師職稱考試經(jīng)濟(jì)學(xué)基礎(chǔ)理論與實(shí)務(wù)題
- 2026年心血管疾病患者飲食調(diào)理與營(yíng)養(yǎng)策略題庫(kù)
- 2026年歷史長(zhǎng)河從古代文明到現(xiàn)代科技的知識(shí)題庫(kù)
- 遼寧省朝陽(yáng)市朝陽(yáng)縣柳城高中2026屆數(shù)學(xué)高三第一學(xué)期期末教學(xué)質(zhì)量檢測(cè)試題含解析
- 吳淞中學(xué)2026屆數(shù)學(xué)高一上期末質(zhì)量檢測(cè)試題含解析
- 2026屆廣東省江門(mén)市普通高中化學(xué)高二第一學(xué)期期末調(diào)研模擬試題含答案
- 園林綠化施工工藝及注意事項(xiàng)
- 2025年高中語(yǔ)文必修上冊(cè)《登泰山記》文言文對(duì)比閱讀訓(xùn)練(含答案)
- 2025年金蝶AI蒼穹平臺(tái)新一代企業(yè)級(jí)AI平臺(tái)報(bào)告-
- 2026屆山東菏澤一中高三化學(xué)第一學(xué)期期末達(dá)標(biāo)測(cè)試試題含解析
- 2025中國(guó)機(jī)械工業(yè)集團(tuán)有限公司(國(guó)機(jī)集團(tuán))社會(huì)招聘19人筆試參考題庫(kù)附答案
- 二年級(jí)上冊(cè)100以內(nèi)的數(shù)學(xué)加減混合口算題500道-A4直接打印
- 2025年二級(jí)造價(jià)師《土建工程實(shí)務(wù)》真題卷(附解析)
- 智慧農(nóng)業(yè)管理中的信息安全對(duì)策
- 港口安全生產(chǎn)知識(shí)培訓(xùn)課件
- 通信凝凍期間安全培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論