版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)庫(kù)觸發(fā)器講師:林強(qiáng)目標(biāo)本章將討論:數(shù)據(jù)庫(kù)觸發(fā)器內(nèi)置程序包2簡(jiǎn)介觸發(fā)器類似于函數(shù)和過程,它們都是具有聲明部分、執(zhí)行部分和異常處理部分的命名PL/SQL塊。像包一樣,觸發(fā)器必須在數(shù)據(jù)庫(kù)中以獨(dú)立對(duì)象的身份存儲(chǔ),并且不能與包和塊具有本地關(guān)系。我們?cè)谇皟烧轮幸呀?jīng)講過,過程是顯式地通過過程調(diào)用從其他塊中執(zhí)行的,同時(shí),過程調(diào)用可以傳遞參數(shù)。與之相反,觸發(fā)器是在事件發(fā)生時(shí)隱式地運(yùn)行的,并且觸發(fā)器不能接收參數(shù)。運(yùn)行觸發(fā)器的方式叫做激發(fā)(firing)觸發(fā)器,觸發(fā)事件可以是對(duì)數(shù)據(jù)庫(kù)表的DML(INSERT、UPDATE或DELETE)操作或某種視圖的操作(View)。Oracle8i把觸發(fā)器功能擴(kuò)展到了可以激發(fā)系統(tǒng)事件,如數(shù)據(jù)庫(kù)的啟動(dòng)和關(guān)閉,以及某種DDL操作。3觸發(fā)器可以用于下列情況:
維護(hù)在表創(chuàng)建階段通過聲明限制無(wú)法實(shí)現(xiàn)的復(fù)雜完整性限制。
通過記錄修改內(nèi)容和修改者來(lái)審計(jì)表中的信息。在表內(nèi)容發(fā)生變更時(shí),自動(dòng)通知其他程序采取相應(yīng)的處理。在訂閱發(fā)布環(huán)境下,發(fā)布有關(guān)各種事件的信息。4數(shù)據(jù)庫(kù)觸發(fā)器數(shù)據(jù)庫(kù)觸發(fā)器是PL/SQL塊或存儲(chǔ)過程是在對(duì)關(guān)聯(lián)表執(zhí)行DML操作時(shí)觸發(fā)的是隱式執(zhí)行的還可能具有聲明部分和異常處理部分5createtableSTUDENTS(
IDINTEGERnotnull,MAJORVARCHAR2(30),CURRENT_CREDITSNUMBER,)CREATETABLEmajor_stats(majorVARCHAR2(30),
total_creditsNUMBER,
total_studentsNUMBER);為了保持表major_stats中的數(shù)據(jù)處于更新狀態(tài),創(chuàng)建一個(gè)每次表students被修改時(shí)自動(dòng)更新表major_stats的觸發(fā)器。例子2/1DML觸發(fā)6例子2/2DML觸發(fā)CREATEORREPLACETRIGGERUpdateMajorStatsAFTERINSERTORDELETEORUPDATEONstudentsDECLARECURSORc_StatisticsISSELECTmajor,COUNT(*)total_students,SUM(current_credits)total_creditsFROMstudentsGROUPBYmajor;BEGINDELETEFROMmajor_stats;FORv_StatsRecordinc_StatisticsLOOPINSERTINTOmajor_stats(major,total_credits,total_students)VALUES(v_StatsRecord.major,v_StatsRecord.total_credits,v_StatsRecord.total_students);ENDLOOP;ENDUpdateMajorStats;7替代觸發(fā)器Oracle8提供的這種替代觸發(fā)器(Instead-oftrigger)只能定義在視圖上(可以是關(guān)系或?qū)ο螅EcDML觸發(fā)器不同,DML觸發(fā)器是在DML操作之外運(yùn)行的,而替代觸發(fā)器則代替激發(fā)它的DML語(yǔ)句運(yùn)行。替代觸發(fā)器是行一級(jí)的。8例子替代觸發(fā)器createtableROOMS(ROOM_IDINTEGERnotnull,DEPARTMENTVARCHAR2(22),BUILDINGVARCHAR2(22))createtableCLASS(
CLASS_IDINTEGER,
COURSEINTEGER,
ROOM_IDINTEGER
)9視圖:CREATEORREPLACEVIEWCLASSES_ROOMSAS
SELECTr.department,r.building,c.room_id
FROMroomsr,classc
WHEREr.room_id=c.room_id
CREATEorreplaceTRIGGERClassesRoomsInsert
INSTEADOFINSERTONclasses_rooms
DECLARE
v_roomID
rooms.room_id%TYPE;
BEGIN
--FirstdeterminetheroomID
SELECTroom_id
INTOv_roomID
FROMrooms
WHEREbuilding=:new.building
ANDroom_id=:new.room_id;
--Andnowupdatetheclass
UPDATECLASSES
SETroom_id=v_roomID
WHEREdepartment=:new.department
ANDcourse=:new.course;
ENDClassesRoomsInsert;
10系統(tǒng)觸發(fā)器Oracle8i提供了第三種觸發(fā)器,這種系統(tǒng)觸發(fā)器在發(fā)生如數(shù)據(jù)庫(kù)啟動(dòng)或關(guān)閉等系統(tǒng)事件時(shí)激發(fā),而不是在執(zhí)行DML語(yǔ)句時(shí)激發(fā)。系統(tǒng)觸發(fā)器也可以在DDL操作時(shí),如表的創(chuàng)建中激發(fā)。例如,假設(shè)我們要記錄對(duì)象創(chuàng)建的時(shí)間,我們可以通過創(chuàng)建下面的表來(lái)實(shí)現(xiàn)上述記錄功能:11系統(tǒng)觸發(fā)器CREATE
TABLE
ddl_creations(
user_id
VARCHAR2(30),
object_type
VARCHAR2(20),
object_name
VARCHAR2(30),
object_owner
VARCHAR2(30),
creation_date
DATE)CREATE
OR
REPLACE
TRIGGER
LogCreations
AFTER
CREATE
ON
SCHEMA
BEGIN
INSERT
INTO
ddl_creations(user_id,object_type,object_name,
object_owner,creation_date)
VALUES(USER,SYS.DICTIONARY_OBJ_TYPE,SYS.DICTIONARY_OBJ_NAME,
SYS.DICTIONARY_OBJ_OWNER,SYSDATE);
END
LogCreations;12創(chuàng)建觸發(fā)器的通用語(yǔ)法:
13createtableTEMP_TABLE
(
NUM_COLNUMBER,
CHAR_COLVARCHAR2(100)
)CREATESEQUENCEtrig_seqSTARTWITH1INCREMENTBY1;CREATEORREPLACEPACKAGETrigPackageAS
--Globalcounterforuseinthetriggers
v_CounterNUMBER;ENDTrigPackage;
14CREATEORREPLACETRIGGERClassesBStatement
BEFOREUPDATEONclass
BEGIN
--Resetthecounterfirst.
TrigPackage.v_Counter:=0;
INSERTINTOtemp_table(num_col,char_col)
VALUES(trig_seq.NEXTVAL,
'BeforeStatement:counter='||TrigPackage.v_Counter);
TrigPackage.v_Counter:=TrigPackage.v_Counter+1;
ENDClassesBStatement;CREATEORREPLACETRIGGERClassesAStatement1AFTERUPDATEONclassBEGININSERTINTOtemp_table(num_col,char_col)VALUES(trig_seq.NEXTVAL,'AfterStatement1:counter='||TrigPackage.v_Counter);--Incrementforthenexttrigger.TrigPackage.v_Counter:=TrigPackage.v_Counter+1;ENDClassesAStatement1;15CREATEORREPLACETRIGGERClassesBRow1BEFOREUPDATEONclassFOREACHROWBEGININSERTINTOtemp_table(num_col,char_col)VALUES(trig_seq.NEXTVAL,'BeforeRow1:counter='||TrigPackage.v_Counter);--Incrementforthenexttrigger.TrigPackage.v_Counter:=TrigPackage.v_Counter+1;ENDClassesBRow1;CREATEORREPLACETRIGGERClassesBRow2
BEFOREUPDATEONclass
FOREACHROW
BEGIN
INSERTINTOtemp_table(num_col,char_col)
VALUES(trig_seq.NEXTVAL,
'BeforeRow2:counter='||TrigPackage.v_Counter);
--Incrementforthenexttrigger.
TrigPackage.v_Counter:=TrigPackage.v_Counter+1;
ENDClassesBRow2;16行觸發(fā)器用FOREACHROW語(yǔ)法;可以用WHEN語(yǔ)法;可以用new.column_name、old.column_name語(yǔ)法;Createorreplacetriggertemp_air
AfterinsertontempForeachrowWhen(new.n=0)Begin
dbms_output.put_line(‘executetrigger’);end17語(yǔ)句觸發(fā)器無(wú)FOREACHROW語(yǔ)法;不可以用WHEN語(yǔ)法;不可以用new.column_name、old.column_name語(yǔ)法;18數(shù)據(jù)庫(kù)觸發(fā)器10-2觸發(fā)器的組成部分觸發(fā)器語(yǔ)句觸發(fā)器主體觸發(fā)器限制19數(shù)據(jù)庫(kù)觸發(fā)器10-3觸發(fā)器語(yǔ)句指定觸發(fā)器定時(shí)、事件、表名及類型觸發(fā)器主體是PL/SQL塊或?qū)^程的調(diào)用觸發(fā)器限制可以通過WHEN子句實(shí)現(xiàn)20數(shù)據(jù)庫(kù)觸發(fā)器10-4觸發(fā)器的類型應(yīng)用程序觸發(fā)器數(shù)據(jù)庫(kù)觸發(fā)器21數(shù)據(jù)庫(kù)觸發(fā)器10-5應(yīng)用程序觸發(fā)器在應(yīng)用程序內(nèi)發(fā)生特定DML事件時(shí),將隱式
觸發(fā)它數(shù)據(jù)庫(kù)觸發(fā)器在表、視圖或數(shù)據(jù)庫(kù)上發(fā)生特定DML事件時(shí),將隱式觸發(fā)它在表和視圖上定義在數(shù)據(jù)庫(kù)或方案上,它也可以充當(dāng)系統(tǒng)
觸發(fā)器22數(shù)據(jù)庫(kù)觸發(fā)器10-6DML觸發(fā)器組件觸發(fā)器定時(shí)觸發(fā)器事件表名觸發(fā)器類型WHEN子句觸發(fā)器主體23數(shù)據(jù)庫(kù)觸發(fā)器10-7變異表當(dāng)前正由DML語(yǔ)句修改聲明刪除級(jí)聯(lián)(引用完整性約束條件)的影響約束表對(duì)于SQL語(yǔ)句,觸發(fā)語(yǔ)句直接讀取對(duì)于聲明的引用完整性約束條件,間接讀取表的變異或約束只是對(duì)會(huì)話而言的24INSTEADOF觸發(fā)器是在視圖上而不是在表上定義的提供修改視圖的透明方法可以針對(duì)視圖編寫INSERT、UPDATE及DELETE語(yǔ)句它以不可見方式在后臺(tái)運(yùn)行執(zhí)行在觸發(fā)器主體中編寫的操作數(shù)據(jù)庫(kù)觸發(fā)器10-825嵌套表上的INSTEADOF觸發(fā)器不能使用TABLE子句直接修改視圖中的嵌套列通過INSTEADOF觸發(fā)器進(jìn)行修改嵌套表上的觸發(fā)器因DML操作而觸發(fā)啟用和禁用觸發(fā)器語(yǔ)法如下:altertrigger<Trigger_name>enable;altertrigger<Trigger_name>disable;
其中,Trigger_name
是觸發(fā)器名稱。數(shù)據(jù)庫(kù)觸發(fā)器10-926刪除觸發(fā)器使用以下語(yǔ)法:droptrigger<trigger_name>;其中,trigger_name
是觸發(fā)器名稱。查看有關(guān)觸發(fā)器的信息使用下列數(shù)據(jù)字典視圖:USER_TRIGGERSALL_TRIGGERSDBA_TRIGGERS數(shù)據(jù)庫(kù)觸發(fā)器10-1027擴(kuò)展數(shù)據(jù)庫(kù)的功能為PL/SQL提供對(duì)SQL功能的訪問用戶SYS擁有所有程序包是公共同義詞可以由任何用戶訪問用戶必須具有EXECUTE權(quán)限,才能訪問過程和函數(shù)內(nèi)置程序包6-128其中的一些內(nèi)置程序包如下:
內(nèi)置程序包6-229DBMS_STANDARD提供語(yǔ)言工具DBMS_ALERT支持?jǐn)?shù)據(jù)庫(kù)事件的異步通知DBMS_OUTPUT允許顯示輸出結(jié)果如果禁用它,則忽略對(duì)此程序包的調(diào)用DBMS_LOB添加用于處理大型對(duì)象的實(shí)用過程和函數(shù)內(nèi)置程序包6-330DBMS_OUTPUT中的一些過程EnableDisablePutPut_lineNew_lineGet_lineGet_lines
內(nèi)置程序包6-431DBMS_LOBappendcomparecopyerasefileclosefileexistsfilegetnamegetlength內(nèi)置程序包6-532Oracle9i中新增程序包的部分列表內(nèi)置程序包6-6程序包名稱描述DBMS_AQELM提供過程管理AdvancedQueuing異步通知的配置(通過電子郵件和HTTP)
。DBMS_FGA提供細(xì)粒度安全函數(shù)。DB
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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年新能源投資合作框架協(xié)議3篇
- 2024商鋪?zhàn)赓U協(xié)議書:綠色家居建材市場(chǎng)租賃范本3篇
- 2024年度工業(yè)自動(dòng)化設(shè)備配件集成采購(gòu)合同范本3篇
- 2024年二零二四年度新型外墻裝飾材料研發(fā)與應(yīng)用合同3篇
- 2024年智能硬件設(shè)備研發(fā)與制造合同
- 2024夏令營(yíng)親子互動(dòng)游戲開發(fā)與實(shí)施合同正規(guī)范本3篇
- 2024年度駕駛員健康保障與福利聘用勞動(dòng)合同3篇
- 2024年暴雨應(yīng)急預(yù)案(30篇)
- 《汽安展廣州站總結(jié)》課件
- 預(yù)防電子郵件詐騙:保護(hù)個(gè)人信息的重要性
- 24秋二年級(jí)上冊(cè)語(yǔ)文期末復(fù)習(xí)21天沖刺計(jì)劃(每日5道題)
- 新探索研究生英語(yǔ)(基礎(chǔ)級(jí))讀寫教程參考答案Language-focus
- 企業(yè)年終總結(jié)大會(huì)PPT模板
- 兩級(jí)CMOS運(yùn)算放大器設(shè)計(jì)
- 住宅項(xiàng)目規(guī)范(2022)
- 2012生物化學(xué)答疑-02
- 蘇教版新版五年級(jí)上冊(cè)科學(xué)全冊(cè)單元期末知識(shí)點(diǎn)梳理(1)
- 《雞兔同籠》ppt課件
- 制袋作業(yè)指導(dǎo)書
- 化工廠防火防爆設(shè)計(jì)
- 高壓氧艙技術(shù)要求
評(píng)論
0/150
提交評(píng)論