




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
數據庫觸發器講師:林強目標本章將討論:數據庫觸發器內置程序包2簡介觸發器類似于函數和過程,它們都是具有聲明部分、執行部分和異常處理部分的命名PL/SQL塊。像包一樣,觸發器必須在數據庫中以獨立對象的身份存儲,并且不能與包和塊具有本地關系。我們在前兩章中已經講過,過程是顯式地通過過程調用從其他塊中執行的,同時,過程調用可以傳遞參數。與之相反,觸發器是在事件發生時隱式地運行的,并且觸發器不能接收參數。運行觸發器的方式叫做激發(firing)觸發器,觸發事件可以是對數據庫表的DML(INSERT、UPDATE或DELETE)操作或某種視圖的操作(View)。Oracle8i把觸發器功能擴展到了可以激發系統事件,如數據庫的啟動和關閉,以及某種DDL操作。3觸發器可以用于下列情況:
維護在表創建階段通過聲明限制無法實現的復雜完整性限制。
通過記錄修改內容和修改者來審計表中的信息。在表內容發生變更時,自動通知其他程序采取相應的處理。在訂閱發布環境下,發布有關各種事件的信息。4數據庫觸發器數據庫觸發器是PL/SQL塊或存儲過程是在對關聯表執行DML操作時觸發的是隱式執行的還可能具有聲明部分和異常處理部分5createtableSTUDENTS(
IDINTEGERnotnull,MAJORVARCHAR2(30),CURRENT_CREDITSNUMBER,)CREATETABLEmajor_stats(majorVARCHAR2(30),
total_creditsNUMBER,
total_studentsNUMBER);為了保持表major_stats中的數據處于更新狀態,創建一個每次表students被修改時自動更新表major_stats的觸發器。例子2/1DML觸發6例子2/2DML觸發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替代觸發器Oracle8提供的這種替代觸發器(Instead-oftrigger)只能定義在視圖上(可以是關系或對象)。與DML觸發器不同,DML觸發器是在DML操作之外運行的,而替代觸發器則代替激發它的DML語句運行。替代觸發器是行一級的。8例子替代觸發器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系統觸發器Oracle8i提供了第三種觸發器,這種系統觸發器在發生如數據庫啟動或關閉等系統事件時激發,而不是在執行DML語句時激發。系統觸發器也可以在DDL操作時,如表的創建中激發。例如,假設我們要記錄對象創建的時間,我們可以通過創建下面的表來實現上述記錄功能:11系統觸發器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創建觸發器的通用語法:
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行觸發器用FOREACHROW語法;可以用WHEN語法;可以用new.column_name、old.column_name語法;Createorreplacetriggertemp_air
AfterinsertontempForeachrowWhen(new.n=0)Begin
dbms_output.put_line(‘executetrigger’);end17語句觸發器無FOREACHROW語法;不可以用WHEN語法;不可以用new.column_name、old.column_name語法;18數據庫觸發器10-2觸發器的組成部分觸發器語句觸發器主體觸發器限制19數據庫觸發器10-3觸發器語句指定觸發器定時、事件、表名及類型觸發器主體是PL/SQL塊或對過程的調用觸發器限制可以通過WHEN子句實現20數據庫觸發器10-4觸發器的類型應用程序觸發器數據庫觸發器21數據庫觸發器10-5應用程序觸發器在應用程序內發生特定DML事件時,將隱式
觸發它數據庫觸發器在表、視圖或數據庫上發生特定DML事件時,將隱式觸發它在表和視圖上定義在數據庫或方案上,它也可以充當系統
觸發器22數據庫觸發器10-6DML觸發器組件觸發器定時觸發器事件表名觸發器類型WHEN子句觸發器主體23數據庫觸發器10-7變異表當前正由DML語句修改聲明刪除級聯(引用完整性約束條件)的影響約束表對于SQL語句,觸發語句直接讀取對于聲明的引用完整性約束條件,間接讀取表的變異或約束只是對會話而言的24INSTEADOF觸發器是在視圖上而不是在表上定義的提供修改視圖的透明方法可以針對視圖編寫INSERT、UPDATE及DELETE語句它以不可見方式在后臺運行執行在觸發器主體中編寫的操作數據庫觸發器10-825嵌套表上的INSTEADOF觸發器不能使用TABLE子句直接修改視圖中的嵌套列通過INSTEADOF觸發器進行修改嵌套表上的觸發器因DML操作而觸發啟用和禁用觸發器語法如下:altertrigger<Trigger_name>enable;altertrigger<Trigger_name>disable;
其中,Trigger_name
是觸發器名稱。數據庫觸發器10-926刪除觸發器使用以下語法:droptrigger<trigger_name>;其中,trigger_name
是觸發器名稱。查看有關觸發器的信息使用下列數據字典視圖:USER_TRIGGERSALL_TRIGGERSDBA_TRIGGERS數據庫觸發器10-1027擴展數據庫的功能為PL/SQL提供對SQL功能的訪問用戶SYS擁有所有程序包是公共同義詞可以由任何用戶訪問用戶必須具有EXECUTE權限,才能訪問過程和函數內置程序包6-128其中的一些內置程序包如下:
內置程序包6-229DBMS_STANDARD提供語言工具DBMS_ALERT支持數據庫事件的異步通知DBMS_OUTPUT允許顯示輸出結果如果禁用它,則忽略對此程序包的調用DBMS_LOB添加用于處理大型對象的實用過程和函數內置程序包6-330DBMS_OUTPUT中的一些過程EnableDisablePutPut_lineNew_lineGet_lineGet_lines
內置程序包6-431DBMS_LOBappendcomparecopyerasefileclosefileexistsfilegetnamegetlength內置程序包6-532Oracle9i中新增程序包的部分列表內置程序包6-6程序包名稱描述DBMS_AQELM提供過程管理AdvancedQueuing異步通知的配置(通過電子郵件和HTTP)
。DBMS_FGA提供細粒度安全函數。DB
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB31/T 1166.2-2019司法行政機關戒毒診斷評估第2部分:生理脫毒
- DB31/T 1067-2017注水式足部按摩器能效等級及評價方法
- DB31/T 1045-2017家政服務機構管理要求
- DB31/ 792-2020硅單晶及其硅片單位產品能源消耗限額
- 海南省三亞市2025年八年級《語文》上學期期末試題與參考答案
- 旅游房車營地租賃與旅游志愿者合作合同
- 虛擬財產交易平臺結算服務與網絡安全保障合同
- 2025年中國北斗導航儀行業市場前景預測及投資價值評估分析報告
- 立體綠化技術咨詢與實施方案合同
- 游戲角色廣告植入版權授權協議
- 2024年江蘇省無錫市中考歷史真題(原卷版)
- 金礦合作協議書
- 山東科技大學投資經濟學(專升本)期末復習題
- 2025年公共安全與管理相關考試題及答案
- 英才宿舍樓畢業設計答辯
- 牛肉生意轉讓協議書
- 2024年中考押題預測卷02(安徽卷)-物理(考試版)A4
- 智能控制理論及應用課件:徑向基函數神經網絡
- 天一大聯考·天一小高考2024-2025學年(下)高三第四次考試生物試題及答案
- 機場地勤筆試題及答案
- 廣東省佛山市2025屆高三下學期二模政治試題 含解析
評論
0/150
提交評論