版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、oracle觸發(fā)器在軟件開(kāi)發(fā)中的應(yīng)用 一.引言:oracle觸發(fā)器在軟件開(kāi)發(fā)中的應(yīng)用,為了數(shù)據(jù)分析和制作報(bào)表的需要,用戶在數(shù)據(jù)模型中加入了冗余數(shù)據(jù),應(yīng)使用觸發(fā)器,以保證數(shù)據(jù)的完整性。關(guān)鍵詞:軟件開(kāi)發(fā) 、觸發(fā)器、oracle。二oracle觸發(fā)器1.oracle觸發(fā)器簡(jiǎn)介 觸發(fā)器(trigger)是數(shù)據(jù)庫(kù)對(duì)象的一種,編碼方式類似存儲(chǔ)過(guò)程,與某張表(table)相關(guān)聯(lián),當(dāng)有dml語(yǔ)句對(duì)表進(jìn)行操作時(shí),可以引起觸發(fā)器的執(zhí)行,達(dá)到對(duì)插入記錄一致性,正確性和規(guī)范性控制的目的。在當(dāng)年c/s時(shí)代盛行的時(shí)候,由于客戶端直接連接數(shù)據(jù)庫(kù),能保證數(shù)據(jù)庫(kù)一致性的只有數(shù)據(jù)庫(kù)本身,此時(shí)主鍵(primary key),外鍵(
2、foreign key),約束(constraint)和觸發(fā)器成為必要的控制機(jī)制。而觸發(fā)器的實(shí)現(xiàn)比較靈活,可編程性強(qiáng),自然成為了最流行的控制機(jī)制。到了b/s時(shí)代,發(fā)展成4層架構(gòu),客戶端不再能直接訪問(wèn)數(shù)據(jù)庫(kù),只有中間件才可以訪問(wèn)數(shù)據(jù)庫(kù)。要控制數(shù)據(jù)庫(kù)的一致性,既可以在中間件里控制,也可以在數(shù)據(jù)庫(kù)端控制。很多的青睞java的開(kāi)發(fā)者,隨之將數(shù)據(jù)庫(kù)當(dāng)成一個(gè)黑盒,把大多數(shù)的數(shù)據(jù)控制工作放在了servlet中執(zhí)行。這樣做,不需要了解太多的數(shù)據(jù)庫(kù)知識(shí),也減少了數(shù)據(jù)庫(kù)編程的復(fù)雜性,但同時(shí)增加了servlet編程的工作量。從架構(gòu)設(shè)計(jì)來(lái)看,中間件的功能是檢查業(yè)務(wù)正確性和執(zhí)行業(yè)務(wù)邏輯,如果把數(shù)據(jù)的一致性檢查放到中間件
3、去做,需要在所有涉及到數(shù)據(jù)寫(xiě)入的地方進(jìn)行數(shù)據(jù)一致性檢查。由于數(shù)據(jù)庫(kù)訪問(wèn)相對(duì)于中間件來(lái)說(shuō)是遠(yuǎn)程調(diào)用,要編寫(xiě)統(tǒng)一的數(shù)據(jù)一致性檢查代碼并非易事,一般采用在多個(gè)地方的增加類似的檢查步驟。一旦一致性檢查過(guò)程發(fā)生調(diào)整,勢(shì)必導(dǎo)致多個(gè)地方的修改,不僅增加工作量,而且無(wú)法保證每個(gè)檢查步驟的正確性。觸發(fā)器的應(yīng)用,應(yīng)該放在關(guān)鍵的,多方發(fā)起的,高頻訪問(wèn)的數(shù)據(jù)表上,過(guò)多使用觸發(fā)器,會(huì)增加數(shù)據(jù)庫(kù)負(fù)擔(dān),降低數(shù)據(jù)庫(kù)性能。而放棄使用觸發(fā)器,則會(huì)導(dǎo)致系統(tǒng)架構(gòu)設(shè)計(jì)上的問(wèn)題,影響系統(tǒng)的穩(wěn)定性。2.oracle觸發(fā)器功能觸發(fā)器是特定事件出現(xiàn)的時(shí)候,自動(dòng)執(zhí)行的代碼塊。類似于存儲(chǔ)過(guò)程,觸發(fā)器與存儲(chǔ)過(guò)程的區(qū)別在于:存儲(chǔ)過(guò)程是由用戶或應(yīng)用程序
4、顯式調(diào)用的,而觸發(fā)器是不能被直接調(diào)用的。功能:1)允許/限制對(duì)表的修改2)自動(dòng)生成派生列,比如自增字段3)強(qiáng)制數(shù)據(jù)一致性4)提供審計(jì)和日志記錄5)防止無(wú)效的事務(wù)處理6)啟用復(fù)雜的業(yè)務(wù)邏輯3觸發(fā)器的概念和類型 數(shù)據(jù)庫(kù)觸發(fā)器(database triggers)是響應(yīng)插入、更新或刪除等數(shù)據(jù)庫(kù)事件而執(zhí)行的過(guò)程。它定義了當(dāng)一些數(shù)據(jù)庫(kù)相關(guān)事件發(fā)生時(shí)應(yīng)采取的動(dòng)作??捎糜诠芾韽?fù)雜的完整性約束,或 監(jiān)控對(duì)表的修改,或通知其它程序,表已發(fā)生修改。它的類型有:語(yǔ)句級(jí)觸發(fā)器,以及行級(jí)觸發(fā)器,前者可以在語(yǔ)句執(zhí)行前或執(zhí)行后被觸發(fā)。后者在每個(gè)觸發(fā)語(yǔ)句影 響的行觸發(fā)一次。還有before和after觸發(fā)的命令。在inser
5、t,update,和delete之前或之后執(zhí)行,引用新舊值進(jìn)行處理。如果需通 過(guò)觸發(fā)器設(shè)定插入行中的某列值,則為了訪問(wèn)“新(new)”值,需使用一個(gè)觸發(fā)器before insert,使用after insert則不行。instead of 觸發(fā)器命令,使用它告訴oracle應(yīng)執(zhí)行什么操作。以上四種大類合成14種小類(略)。各種觸發(fā)器的執(zhí)行順序如下: 如果有,最先執(zhí)行語(yǔ)句級(jí)before觸發(fā)器。 每個(gè)insert,delete,update影響的行; 如果有,最先執(zhí)行行級(jí)before; 執(zhí)行行的delete或update; 如果有,執(zhí)行行級(jí)after觸發(fā)器; 如果有,執(zhí)行語(yǔ)句級(jí)after觸發(fā)器。
6、4.觸發(fā)器的組成部分 1、 觸發(fā)器名稱 2、 觸發(fā)語(yǔ)句 3、 觸發(fā)器限制 4、 觸發(fā)操作 (1)、 觸發(fā)器名稱 create trigger biufer_employees_department_id 命名習(xí)慣: biufer(before insert update for each row) employees 表名 department_id 列名 (2)、 觸發(fā)語(yǔ)句 比如: 表或視圖上的dml語(yǔ)句 ddl語(yǔ)句 觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程,它在插入,刪除或修改特定表中的數(shù)據(jù)時(shí)觸發(fā)執(zhí)行,它比數(shù)據(jù)庫(kù)本身標(biāo)準(zhǔn)的功能有更精細(xì)和更復(fù)雜的數(shù)據(jù)控制能力。數(shù)據(jù)庫(kù)觸發(fā)器有以下的作用:l 安全性??梢曰?/p>
7、數(shù)據(jù)庫(kù)的值使用戶具有操作數(shù)據(jù)庫(kù)的某種權(quán)利。l 可以基于時(shí)間限制用戶的操作,例如不允許下班后和節(jié)假日修改數(shù)據(jù)庫(kù)數(shù)據(jù)。l 可以基于數(shù)據(jù)庫(kù)中的數(shù)據(jù)限制用戶的操作,例如不允許股票的價(jià)格的升幅一次超過(guò)10%。l 審計(jì)??梢愿櫽脩魧?duì)數(shù)據(jù)庫(kù)的操作。l 審計(jì)用戶操作數(shù)據(jù)庫(kù)的語(yǔ)句。l 把用戶對(duì)數(shù)據(jù)庫(kù)的更新寫(xiě)入審計(jì)表。l 實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)完整性規(guī)則。l 實(shí)現(xiàn)非標(biāo)準(zhǔn)的數(shù)據(jù)完整性檢查和約束。觸發(fā)器可產(chǎn)生比規(guī)則更為復(fù)雜的限制。與規(guī)則不同,觸發(fā)器可以引用列或數(shù)據(jù)庫(kù)對(duì)象。例如,觸發(fā)器可回退任何企圖吃進(jìn)超過(guò)自己保證金的期貨。l 提供可變的缺省值。l 實(shí)現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)相關(guān)完整性規(guī)則。觸發(fā)器可以對(duì)數(shù)據(jù)庫(kù)中相關(guān)的表進(jìn)行連環(huán)
8、更新。例如,在auths表author_code列上的刪除觸發(fā)器可導(dǎo)致相應(yīng)刪除在其它表中的與之匹配的行。l 在修改或刪除時(shí)級(jí)聯(lián)修改或刪除其它表中的與之匹配的行。l 在修改或刪除時(shí)把其它表中的與之匹配的行設(shè)成null值。l 在修改或刪除時(shí)把其它表中的與之匹配的行級(jí)聯(lián)設(shè)成缺省值。l 觸發(fā)器能夠拒絕或回退那些破壞相關(guān)完整性的變化,取消試圖進(jìn)行數(shù)據(jù)更新的事務(wù)。當(dāng)插入一個(gè)與其主健不匹配的外部鍵時(shí),這種觸發(fā)器會(huì)起作用。例如,可以在books.author_code列上生成一個(gè)插入觸發(fā)器,如果新值與auths.author_code列中的某值不匹配時(shí),插入被回退。l 同步實(shí)時(shí)地復(fù)制表中的數(shù)據(jù)。l 自動(dòng)計(jì)算數(shù)
9、據(jù)值,如果數(shù)據(jù)的值達(dá)到了一定的要求,則進(jìn)行特定的處理5使用數(shù)據(jù)庫(kù)觸發(fā)器管理數(shù)據(jù)冗余性 為了數(shù)據(jù)分析和制作報(bào)表的需要,用戶在數(shù)據(jù)模型中加入了冗余數(shù)據(jù),應(yīng)使用觸發(fā)器,以保證數(shù)據(jù)的完整性。 冗余數(shù)據(jù)可以用規(guī)定的 for each row選項(xiàng)的before update觸發(fā)器進(jìn)行管理。update 命令可放在觸發(fā)器中對(duì)所有需要更新的冗余數(shù)據(jù)進(jìn)行更新,如客戶表和訂單表,訂單表包括客戶的訂單和客戶表的冗余信息,客戶表(customer)的表結(jié) 構(gòu):客戶號(hào)(cu_no)、客戶名(cu_name)、客戶地址(cu_address)。訂單表(order)的表結(jié)構(gòu):訂單號(hào)(or_no),客戶號(hào) (or_no),客
10、戶名(cu_name),客戶地址(cu_address),當(dāng)客戶基表中的數(shù)據(jù)被更新時(shí)更新訂單中的冗余列。語(yǔ)法如下: create or replace trigger bj_customer before update on customer for each row begin update order set cu_no=:new.cu_no, cu_name=:new.cu_name, cu_address=:new.cu_addess, where cu_no=:old.cu_no; end; 6用觸發(fā)器完成數(shù)據(jù)復(fù)制 如果需求非常有限,可以用數(shù)據(jù)觸發(fā)器從一個(gè)數(shù)據(jù)庫(kù)中向另一個(gè)數(shù)據(jù)庫(kù)復(fù)制數(shù)
11、據(jù),如果數(shù) 據(jù)復(fù)制需求僅與數(shù)據(jù)的插入有關(guān),當(dāng)一條記錄插入到一個(gè)數(shù)據(jù)庫(kù)中的某個(gè)基表中時(shí),用戶還希望把這條記錄插入到一個(gè)遠(yuǎn)程數(shù)據(jù)庫(kù)中,需用create database link語(yǔ)句創(chuàng)建一條到遠(yuǎn)程數(shù)據(jù)庫(kù)的連接,一旦創(chuàng)建了一條數(shù)據(jù)庫(kù)連接后,就可以在基表上創(chuàng)建一個(gè)after insert觸發(fā)器,以把每一條記錄插入到遠(yuǎn)程數(shù)據(jù)庫(kù)中。 (1) 在腳本中創(chuàng)建數(shù)據(jù)庫(kù)連接(database link)bj_ysd_remote基表作為數(shù)據(jù)庫(kù)基表,bj_ysd_local代表本地?cái)?shù)據(jù)庫(kù)上的源基表。 creat database link remote(連接名) connect to bj(帳戶) indentifi
12、ed by bj(密碼) using :2; (2)復(fù)制記錄 create or replace trigger trig_ysd(觸發(fā)器名) after insert on bj_ysd_local for each row begin insert into bj_ysd_remotedblink remote value(:new.x1,:new.x2,)/x1.x2代表字段名 end; (3)刪除記錄 create or replace trigger trig_ysd_del after delete on bj_ysd_local for each row begin delete
13、 from bj_ysd_remotedblink remote where x1=:old.x1 end;7用數(shù)據(jù)庫(kù)觸發(fā)器完成瀑布式刪除操作 在某些情況下,當(dāng)要?jiǎng)h除一條記錄時(shí),該記錄是與外鍵有關(guān)的另外一張基表上的記錄時(shí), 這個(gè)刪除操作必須在模型中進(jìn)行傳遞,否則會(huì)出現(xiàn)大量的冗長(zhǎng)數(shù)據(jù),仍以cumstomer 和order基表為例,當(dāng)從customer中刪除一個(gè)客戶時(shí),order基表中所有相關(guān)記錄也應(yīng)當(dāng)刪除。 create or replace trigger trig_cust before delete oncustomer for each row begin delete from ord
14、er wherecu_no=old.cu_no; end; 8用觸發(fā)器完成動(dòng)態(tài)數(shù)據(jù)的操作 在涉及如何實(shí)現(xiàn)動(dòng)態(tài)庫(kù)存的問(wèn)題時(shí),可用觸發(fā)器解決。倉(cāng)庫(kù)有驗(yàn)收、出庫(kù)、調(diào)撥、報(bào)廢、 退料、讓售等這些數(shù)據(jù)必須與以前的庫(kù)存相加減,才能完成動(dòng)態(tài)庫(kù)存操作。本文僅以驗(yàn)收單觸發(fā)器為例,其它的結(jié)構(gòu)雷同。它們涉及到兩個(gè)基表:bi_ysd (驗(yàn)收單),bj_kcb(當(dāng)前庫(kù)存表),前者的表結(jié)構(gòu)(rq(日期),ysdh(驗(yàn)收單號(hào)), bjbm(備件編碼),yssl(驗(yàn)收數(shù)量),ysdj(驗(yàn)收單價(jià))),后者的表結(jié)構(gòu)為(bjbm(備件編碼),dqkcl(當(dāng)前庫(kù)存量),dqkcje (當(dāng)前庫(kù)存金額)觸發(fā)器如下: create or
15、replace trigger trig_ysd after insert or update or delete on bj_ysd for each row declare rq1 varchar2(8);rq2 varchar2(8); /*限于篇幅,yssl1,yssl2,ysdj1,ysdj2,bjbm1,bjbm2,ii聲明略*/ if inserting or updating then rq1:=:new.rq;bjbm1:=:new.bjbm;yssl1:=:new.yssl; ysdj1:=:new.ysdj; select count(*) into ii from bj
16、_dqkcb where bjbm=bjbm1; ifii=0then insertintobj_dqkcb(bjbm,dqkcl,dqkcje) value(bjbm1,yssl1,ysdj1); else update bj_dqkcb set dqkcl=dqkcl+yssl1; dqkcje=dqkcje+yssl1*ysdj1; end if end if if deleting or updating then rq2:=:old.rq;bjbm2:=:old.bjbm;yssl2:=:old.yssl; ysdj2:=:old.ysdj; update bj_dqkcb set dqkcb=dqkcl-yssl2; dqkcje=dqkcje-yssl2*ysdj2 end if; end ;. 總結(jié)在軟件開(kāi)發(fā)中oracle觸發(fā)器可以提供很多快捷方便的幫助,雖然oracle觸發(fā)器的用途很多,但是過(guò)多的使用觸發(fā)器或者觸發(fā)器寫(xiě)得不好,都將影響整個(gè)數(shù)據(jù)庫(kù)的性能。因此,使用觸發(fā)器的時(shí)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024專業(yè)個(gè)人汽車租賃協(xié)議指南
- DB11∕T 1704-2019 中小學(xué)生體育與健康課運(yùn)動(dòng)負(fù)荷監(jiān)測(cè)與評(píng)價(jià)
- 2024年定制航拍服務(wù)協(xié)議范本下載
- 2024年全球貿(mào)易條款專業(yè)翻譯協(xié)議
- 2024年道路工程水穩(wěn)層施工協(xié)議范本
- 2024財(cái)務(wù)人員勞務(wù)合作協(xié)議
- 2024企業(yè)項(xiàng)目技術(shù)實(shí)施與服務(wù)協(xié)議
- 2024年度工業(yè)創(chuàng)新設(shè)計(jì)項(xiàng)目協(xié)議
- 2024年高級(jí)不銹鋼欄桿定制協(xié)議
- 場(chǎng)地合作事宜2024年協(xié)議樣本
- 北京市歷年中考語(yǔ)文現(xiàn)代文之議論文閱讀30篇(含答案)(2003-2023)
- 四川省綿陽(yáng)市2025屆高三數(shù)學(xué)上學(xué)期第一次診斷性考試試題文含解析
- 請(qǐng)款單模板(范本)
- 2024版數(shù)據(jù)服務(wù)合同數(shù)據(jù)采集服務(wù)合同
- 2024年山東選調(diào)行測(cè)真題題目
- 2024-2025學(xué)年部編版思想政治高一上學(xué)期試卷及答案解析
- JGJ196-2010建筑施工塔式起重機(jī)安裝、使用、拆卸安全技術(shù)規(guī)程
- 孫中山誕辰紀(jì)念日主題班會(huì)主題班會(huì)
- 壓力容器使用單位每周壓力容器安全排查治理報(bào)告
- 2024-2030年中國(guó)睡眠磨牙癥治療行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 電氣控制與PLC課程設(shè)計(jì)教學(xué)大綱
評(píng)論
0/150
提交評(píng)論