第13章 觸發(fā)器_第1頁(yè)
第13章 觸發(fā)器_第2頁(yè)
第13章 觸發(fā)器_第3頁(yè)
第13章 觸發(fā)器_第4頁(yè)
第13章 觸發(fā)器_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第13章章 觸觸 發(fā)發(fā) 器器本章目標(biāo)本章目標(biāo)n理解什么是觸發(fā)器理解什么是觸發(fā)器n掌握如何使用掌握如何使用BEFORE和和AFTER觸發(fā)觸發(fā)器器n掌握行觸發(fā)器和語(yǔ)句觸發(fā)器的區(qū)別與使掌握行觸發(fā)器和語(yǔ)句觸發(fā)器的區(qū)別與使用用n掌握如何使用掌握如何使用INSTEAD OF觸發(fā)器觸發(fā)器13.1 什么是觸發(fā)器什么是觸發(fā)器n基本概念基本概念n數(shù)據(jù)庫(kù)觸發(fā)器是存儲(chǔ)于數(shù)據(jù)庫(kù)的命名數(shù)據(jù)庫(kù)觸發(fā)器是存儲(chǔ)于數(shù)據(jù)庫(kù)的命名PL/SQL語(yǔ)句塊,當(dāng)觸發(fā)事件發(fā)生時(shí)它們會(huì)隱含執(zhí)行。語(yǔ)句塊,當(dāng)觸發(fā)事件發(fā)生時(shí)它們會(huì)隱含執(zhí)行。n執(zhí)行觸發(fā)器的活動(dòng)被稱(chēng)為觸發(fā)觸發(fā)器。執(zhí)行觸發(fā)器的活動(dòng)被稱(chēng)為觸發(fā)觸發(fā)器。n觸發(fā)事件觸發(fā)事件n處理數(shù)據(jù)庫(kù)表的處理數(shù)據(jù)庫(kù)

2、表的DML語(yǔ)句語(yǔ)句n特定用戶在特定模式下,或者任何用戶執(zhí)行的特定用戶在特定模式下,或者任何用戶執(zhí)行的DDL語(yǔ)句語(yǔ)句n系統(tǒng)事件系統(tǒng)事件n用戶事件用戶事件n主要用于:主要用于:n執(zhí)行不能通過(guò)使用完整性約束來(lái)定義的復(fù)雜業(yè)執(zhí)行不能通過(guò)使用完整性約束來(lái)定義的復(fù)雜業(yè)務(wù)規(guī)則務(wù)規(guī)則n維護(hù)復(fù)雜的安全規(guī)則維護(hù)復(fù)雜的安全規(guī)則n自動(dòng)生成衍生列的值自動(dòng)生成衍生列的值n收集有關(guān)訪問(wèn)數(shù)據(jù)庫(kù)表的統(tǒng)計(jì)信息收集有關(guān)訪問(wèn)數(shù)據(jù)庫(kù)表的統(tǒng)計(jì)信息n防止無(wú)效的事務(wù)防止無(wú)效的事務(wù)n提供值審計(jì)提供值審計(jì)創(chuàng)建觸發(fā)器創(chuàng)建觸發(fā)器n語(yǔ)法語(yǔ)法CREATE OR REPLACE TRIGGER CREATE OR REPLACE TRIGGER trigg

3、er_nametrigger_name BEFORE | AFTER BEFORE | AFTER trigger_eventtrigger_event ON ON table_nametable_name FOR EACH ROW FOR EACH ROW FOLLOWS FOLLOWS anther_triggeranther_trigger ENABLE | DISABLE ENABLE | DISABLE WHEN WHEN coditioncodition trigger_bodytrigger_body; ;Oracle 11g引入的引入的BEFORE觸發(fā)器觸發(fā)器nBEFORE觸發(fā)

4、器適用于:觸發(fā)器適用于:n當(dāng)在當(dāng)在INSERT或者或者UPDATE語(yǔ)句完成之前,觸語(yǔ)句完成之前,觸發(fā)器需要提供衍生列的值時(shí);發(fā)器需要提供衍生列的值時(shí);n當(dāng)觸發(fā)器決定當(dāng)觸發(fā)器決定INSERT、UPDATE或者或者DELETE語(yǔ)句是否應(yīng)該允許完成的時(shí)候。語(yǔ)句是否應(yīng)該允許完成的時(shí)候。create or replace trigger tr_emp_insert before insert on emp for each rowbegin :new.hiredate := sysdate;end; 【例【例13-1】創(chuàng)建】創(chuàng)建BEFORE觸發(fā)器,使用當(dāng)前系觸發(fā)器,使用當(dāng)前系統(tǒng)日期作為新增雇員的雇傭日期

5、。統(tǒng)日期作為新增雇員的雇傭日期。注意:偽記錄注意:偽記錄 :old 和和 :new 只能用于行觸發(fā)器。只能用于行觸發(fā)器。:old 和和 :new 偽記錄偽記錄觸發(fā)語(yǔ)句觸發(fā)語(yǔ)句:old:newINSERT未定義,所有字段均為未定義,所有字段均為NULL語(yǔ)句結(jié)束時(shí),將要被插語(yǔ)句結(jié)束時(shí),將要被插入的值入的值UPDATE 更新前行的原始值更新前行的原始值語(yǔ)句結(jié)束時(shí),將要被更語(yǔ)句結(jié)束時(shí),將要被更新的值新的值DELETE行被刪除前的原始值行被刪除前的原始值未定義,所有字段均為未定義,所有字段均為NULLAFTER觸發(fā)器觸發(fā)器nAFTER觸發(fā)器適用于:觸發(fā)器適用于:n當(dāng)觸發(fā)器應(yīng)該在當(dāng)觸發(fā)器應(yīng)該在DML執(zhí)行之

6、后被觸發(fā)時(shí)執(zhí)行之后被觸發(fā)時(shí)n當(dāng)觸發(fā)器執(zhí)行當(dāng)觸發(fā)器執(zhí)行BEFORE觸發(fā)器中未指明的動(dòng)作觸發(fā)器中未指明的動(dòng)作時(shí)時(shí)create or replace trigger tr_log after delete on deptbegin insert into t_logs(log_time, log_user, log_opt) values(sysdate, user, DELETE ON dept);end; 【例【例13-2】創(chuàng)建】創(chuàng)建AFTER觸發(fā)器,刪除觸發(fā)器,刪除dept表表記錄后,向記錄后,向t_logs日志表中寫(xiě)入操作信息。日志表中寫(xiě)入操作信息。WHEN子句子句nWHEN子句只能在行觸發(fā)

7、器中使用。子句只能在行觸發(fā)器中使用。n如果在行觸發(fā)器的定義中給出了如果在行觸發(fā)器的定義中給出了WHEN子子句,觸發(fā)器主體就只對(duì)滿足句,觸發(fā)器主體就只對(duì)滿足WHEN所定義所定義條件的那些記錄行執(zhí)行。條件的那些記錄行執(zhí)行。n在在WHEN子句的條件中使用子句的條件中使用:new和和:old時(shí),時(shí),都不需要冒號(hào)作為前綴。都不需要冒號(hào)作為前綴。create or replace trigger tr_sal_2000 before update on emp for each row when (new.sal 2000)begin dbms_output.put_line(execute);end;

8、【例【例13-3】創(chuàng)建觸發(fā)器,當(dāng)雇員工資大于】創(chuàng)建觸發(fā)器,當(dāng)雇員工資大于2000時(shí)執(zhí)行該觸發(fā)器主體部分。時(shí)執(zhí)行該觸發(fā)器主體部分。create or replace trigger tr_sal_2000 before update on emp for each rowbegin if :new.sal 2000 then dbms_output.put_line(execute); end if;end; 等價(jià)于:等價(jià)于:觸發(fā)器謂詞觸發(fā)器謂詞謂詞謂詞行為特征行為特征INSERTING如果激活語(yǔ)句是如果激活語(yǔ)句是INSERT語(yǔ)句,就為語(yǔ)句,就為T(mén)RUE;否則就為否則就為FALSEUPDATIN

9、G如果激活語(yǔ)句是如果激活語(yǔ)句是UPDATE語(yǔ)句,就為語(yǔ)句,就為T(mén)RUE;否則就為否則就為FALSEDELETING如果激活語(yǔ)句是如果激活語(yǔ)句是DELETE語(yǔ)句,就為語(yǔ)句,就為T(mén)RUE;否則就為否則就為FALSEcreate or replace trigger tr_log after insert or update or delete on deptdeclare v_opt varchar2(100); begin if inserting then v_opt := INSERT ON dept; end if; if updating then v_opt := UPDATE ON

10、dept; end if; if deleting then v_opt := DELETE ON dept; end if; insert into t_logs(log_time, log_user, log_opt) values(sysdate, user, v_opt);end; 【例【例13-4】修改【例】修改【例13-2】創(chuàng)建的觸發(fā)器,根據(jù)】創(chuàng)建的觸發(fā)器,根據(jù)DML操作類(lèi)型將操作信息寫(xiě)入日志表操作類(lèi)型將操作信息寫(xiě)入日志表t_logs中。中。自治事務(wù)自治事務(wù)n自治事務(wù)是由其他事務(wù)(通常被稱(chēng)為主事務(wù))發(fā)自治事務(wù)是由其他事務(wù)(通常被稱(chēng)為主事務(wù))發(fā)起的獨(dú)立事務(wù)。起的獨(dú)立事務(wù)。n自治事務(wù)會(huì)

11、執(zhí)行多個(gè)自治事務(wù)會(huì)執(zhí)行多個(gè)DML語(yǔ)句,并且提交或者回語(yǔ)句,并且提交或者回滾操作,而不會(huì)提交或者回滾主事務(wù)執(zhí)行的滾操作,而不會(huì)提交或者回滾主事務(wù)執(zhí)行的DML語(yǔ)句。語(yǔ)句。n使用使用AUTONOMOUS_TRANSACTION編譯命令,編譯命令,可以定義一個(gè)自治事務(wù)。可以定義一個(gè)自治事務(wù)。n在語(yǔ)句塊的聲明部分使用:在語(yǔ)句塊的聲明部分使用:DECLARE PRAGMA AUTONOMOUS_TRANSACTION;create or replace trigger tr_log after delete on deptdeclare pragma autonomous_transaction;begi

12、n insert into t_logs(log_time, log_user, log_opt) values(sysdate, user, DELETE ON dept); commit;end; 【例【例13-5】使用自治事務(wù)修改【例】使用自治事務(wù)修改【例13-2】創(chuàng)】創(chuàng)建的觸發(fā)器。建的觸發(fā)器。13.2 觸發(fā)器類(lèi)型觸發(fā)器類(lèi)型n觸發(fā)器類(lèi)型觸發(fā)器類(lèi)型n行觸發(fā)器行觸發(fā)器n語(yǔ)句觸發(fā)器語(yǔ)句觸發(fā)器n二者的區(qū)別二者的區(qū)別n行觸發(fā)器被觸發(fā)的次數(shù)等于觸發(fā)語(yǔ)句所影響的行觸發(fā)器被觸發(fā)的次數(shù)等于觸發(fā)語(yǔ)句所影響的數(shù)據(jù)行數(shù)。數(shù)據(jù)行數(shù)。n語(yǔ)句觸發(fā)器每執(zhí)行一次觸發(fā)語(yǔ)句,該觸發(fā)器就語(yǔ)句觸發(fā)器每執(zhí)行一次觸發(fā)語(yǔ)句,該觸發(fā)器就

13、執(zhí)行一次,與觸發(fā)語(yǔ)句所影響的數(shù)據(jù)行數(shù)無(wú)關(guān)。執(zhí)行一次,與觸發(fā)語(yǔ)句所影響的數(shù)據(jù)行數(shù)無(wú)關(guān)。DML觸發(fā)器的激活順序觸發(fā)器的激活順序n執(zhí)行執(zhí)行BEFORE語(yǔ)句觸發(fā)器語(yǔ)句觸發(fā)器n對(duì)受該語(yǔ)句影響的每一行記錄:對(duì)受該語(yǔ)句影響的每一行記錄:n執(zhí)行執(zhí)行BEFORE行觸發(fā)器行觸發(fā)器n執(zhí)行該執(zhí)行該DML語(yǔ)句本身語(yǔ)句本身n執(zhí)行執(zhí)行AFTER行觸發(fā)器行觸發(fā)器n執(zhí)行執(zhí)行AFTER語(yǔ)句觸發(fā)器語(yǔ)句觸發(fā)器INSTEAD OF觸發(fā)器觸發(fā)器nINSTEAD OF觸發(fā)器只能定義于數(shù)據(jù)庫(kù)視觸發(fā)器只能定義于數(shù)據(jù)庫(kù)視圖,作為行觸發(fā)器創(chuàng)建。圖,作為行觸發(fā)器創(chuàng)建。ninstead-of觸發(fā)器用于以下兩種情況:觸發(fā)器用于以下兩種情況:n允許修改一

14、個(gè)本來(lái)無(wú)法修改的視圖。允許修改一個(gè)本來(lái)無(wú)法修改的視圖。n修改視圖中嵌套表列的列。修改視圖中嵌套表列的列。無(wú)法修改的視圖無(wú)法修改的視圖n如果某視圖查詢(xún)執(zhí)行如下任何一個(gè)操作,或如果某視圖查詢(xún)執(zhí)行如下任何一個(gè)操作,或者包含如下任何結(jié)果,則視圖就不能被者包含如下任何結(jié)果,則視圖就不能被INSERT INSERT 、 UPDATEUPDATE或者或者DELETEDELETE語(yǔ)句修改:語(yǔ)句修改:n集合操作,如集合操作,如UNIONUNION、UNION ALLUNION ALL、INTERSECT INTERSECT 和和 MINUSMINUSn分組函數(shù),如分組函數(shù),如COUNTCOUNT、 AVGAVG

15、、SUMSUM、MAX MAX 和和 MINMINnGROUP BYGROUP BY語(yǔ)句語(yǔ)句nCONNECT BYCONNECT BY或者或者START WITHSTART WITH語(yǔ)句語(yǔ)句nDISTINCTDISTINCT操作符操作符nROWNUMROWNUM偽列偽列create or replace view v_Empas select * from emp where rownum = 5;【例【例13-6】創(chuàng)建視圖,返回前】創(chuàng)建視圖,返回前5名雇員信息。名雇員信息。思考:能否執(zhí)行如下刪除操作?思考:能否執(zhí)行如下刪除操作?delete from v_Emp where empno =

16、7369;create or replace trigger tr_del_v_emp instead of delete on v_empbegin delete from emp where empno = :old.empno;end; 【例【例13-6】創(chuàng)建】創(chuàng)建INSTEAD OF觸發(fā)器,以完觸發(fā)器,以完成刪除操作。成刪除操作。思考:為什么在思考:為什么在INSTEAD OF觸發(fā)器中,沒(méi)有使用觸發(fā)器中,沒(méi)有使用FOR EACH ROW選項(xiàng),卻可以使用選項(xiàng),卻可以使用:OLD偽記錄?偽記錄?系統(tǒng)觸發(fā)器系統(tǒng)觸發(fā)器n系統(tǒng)觸發(fā)器的激發(fā)是基于兩種不同的事件:系統(tǒng)觸發(fā)器的激發(fā)是基于兩種不同的事件

17、:nDDL事件事件n數(shù)據(jù)庫(kù)事件數(shù)據(jù)庫(kù)事件nDDL事件包括事件包括CREATE、ALTER或或DROP語(yǔ)語(yǔ)句句n數(shù)據(jù)庫(kù)事件包括數(shù)據(jù)庫(kù)服務(wù)器的啟動(dòng)數(shù)據(jù)庫(kù)事件包括數(shù)據(jù)庫(kù)服務(wù)器的啟動(dòng)/關(guān)閉關(guān)閉事件,用戶的登錄事件,用戶的登錄/斷開(kāi)事件,以及服務(wù)器斷開(kāi)事件,以及服務(wù)器錯(cuò)誤。錯(cuò)誤。創(chuàng)建系統(tǒng)觸發(fā)器創(chuàng)建系統(tǒng)觸發(fā)器n語(yǔ)法語(yǔ)法CREATE OR REPLACE TRIGGER CREATE OR REPLACE TRIGGER schemaschema.trigger_nametrigger_name BEFORE | AFTER BEFORE | AFTER ddl_event_listddl_event_li

18、st | | database_event_listdatabase_event_list ON DATABASE | ON DATABASE | schemaschema.SCHEMA.SCHEMA when_clausewhen_clause trigger_bodytrigger_body; ;注意:創(chuàng)建系統(tǒng)觸發(fā)器必須擁有系統(tǒng)權(quán)限注意:創(chuàng)建系統(tǒng)觸發(fā)器必須擁有系統(tǒng)權(quán)限ADMINISTER DATABASE TRIGGERADMINISTER DATABASE TRIGGER系統(tǒng)系統(tǒng)DDL事件和數(shù)據(jù)庫(kù)事件事件和數(shù)據(jù)庫(kù)事件事件事件允許時(shí)機(jī)允許時(shí)機(jī)說(shuō)明說(shuō)明STARTUPAFTER啟動(dòng)數(shù)據(jù)庫(kù)實(shí)例的

19、時(shí)候激活啟動(dòng)數(shù)據(jù)庫(kù)實(shí)例的時(shí)候激活SHUTDOWNBEFORE關(guān)閉數(shù)據(jù)庫(kù)實(shí)例的時(shí)候激活。如關(guān)閉數(shù)據(jù)庫(kù)實(shí)例的時(shí)候激活。如果數(shù)據(jù)庫(kù)是非正常退出的,這個(gè)果數(shù)據(jù)庫(kù)是非正常退出的,這個(gè)事件可能就不會(huì)激活事件可能就不會(huì)激活SERVERERRORAFTER只有發(fā)生錯(cuò)誤,該事件就會(huì)激活只有發(fā)生錯(cuò)誤,該事件就會(huì)激活LOGONAFTER用戶成功連接到數(shù)據(jù)庫(kù)以后激活用戶成功連接到數(shù)據(jù)庫(kù)以后激活LOGOFFBEFORE用戶開(kāi)始斷開(kāi)數(shù)據(jù)庫(kù)連接的時(shí)候用戶開(kāi)始斷開(kāi)數(shù)據(jù)庫(kù)連接的時(shí)候激活激活CREATEBEFORE, AFTER創(chuàng)建模式對(duì)象之前或之后激活創(chuàng)建模式對(duì)象之前或之后激活A(yù)LTERBEFORE, AFTER更改模式對(duì)象之

20、前或之后激活更改模式對(duì)象之前或之后激活DROPBEFORE, AFTER刪除模式對(duì)象之前或之后激活刪除模式對(duì)象之前或之后激活數(shù)據(jù)庫(kù)與模式觸發(fā)器數(shù)據(jù)庫(kù)與模式觸發(fā)器 n系統(tǒng)觸發(fā)器可以在數(shù)據(jù)庫(kù)級(jí)別或模式級(jí)別定義,系統(tǒng)觸發(fā)器可以在數(shù)據(jù)庫(kù)級(jí)別或模式級(jí)別定義, DATABASE DATABASE 和和 SCHEMASCHEMA關(guān)鍵字決定了給定系統(tǒng)觸發(fā)關(guān)鍵字決定了給定系統(tǒng)觸發(fā)器的級(jí)別。器的級(jí)別。n數(shù)據(jù)庫(kù)級(jí)別的觸發(fā)器不管觸發(fā)事件何時(shí)發(fā)生都將數(shù)據(jù)庫(kù)級(jí)別的觸發(fā)器不管觸發(fā)事件何時(shí)發(fā)生都將激發(fā),而模式級(jí)別觸發(fā)器只有在指定的模式的觸激發(fā),而模式級(jí)別觸發(fā)器只有在指定的模式的觸發(fā)事件發(fā)生時(shí)才會(huì)激發(fā)。發(fā)事件發(fā)生時(shí)才會(huì)激發(fā)?!?/p>

21、例【例13-7】數(shù)據(jù)庫(kù)觸發(fā)器與模式觸發(fā)器的區(qū)別】數(shù)據(jù)庫(kù)觸發(fā)器與模式觸發(fā)器的區(qū)別1.以以sys用戶登錄,創(chuàng)建用戶用戶登錄,創(chuàng)建用戶userA、userB,并授與,并授與DBA權(quán)限;權(quán)限;2.以以u(píng)serA用戶登錄,創(chuàng)建表用戶登錄,創(chuàng)建表t_logon,用以記錄用,用以記錄用戶的登錄信息;戶的登錄信息;3.創(chuàng)建數(shù)據(jù)庫(kù)觸發(fā)器創(chuàng)建數(shù)據(jù)庫(kù)觸發(fā)器tr_LogOn_all;4.以以u(píng)serB用戶登錄,創(chuàng)建模式觸發(fā)器用戶登錄,創(chuàng)建模式觸發(fā)器tr_LogOn_userB;5.在在SQL *Plus中分別以中分別以u(píng)serA、userB用戶登錄,用戶登錄,查看查看t_logon表中的記錄。表中的記錄。- 創(chuàng)建數(shù)據(jù)

22、庫(kù)觸發(fā)器創(chuàng)建數(shù)據(jù)庫(kù)觸發(fā)器create or replace trigger tr_LogOn_all after logon on databasebegin insert into t_logon values(1, user, tr_LogOn_all);end;- 創(chuàng)建創(chuàng)建模式模式觸發(fā)器觸發(fā)器create or replace trigger tr_LogOn_UserB after logon on schemabegin insert into userA.t_logon values(2, user, tr_LogOn_UserB);end; userB.SCHEMA事件的屬性函數(shù)

23、事件的屬性函數(shù)屬性函數(shù)屬性函數(shù)返回類(lèi)型返回類(lèi)型對(duì)應(yīng)的系統(tǒng)事件對(duì)應(yīng)的系統(tǒng)事件說(shuō)明說(shuō)明ORA_DATABASE_NAMEVARCHAR2(50)所有事件所有事件返回?cái)?shù)據(jù)庫(kù)的名稱(chēng)返回?cái)?shù)據(jù)庫(kù)的名稱(chēng)ORA_DICT_OBJ_NAMEVARCHAR2(30)CREATE, ALTER, DROP返回在其上執(zhí)行返回在其上執(zhí)行DDL操作的數(shù)操作的數(shù)據(jù)字典對(duì)象的名稱(chēng)據(jù)字典對(duì)象的名稱(chēng)ORA_DICT_OBJ_OWNERVARCHAR2(30)CREATE, ALTER, DROP返回在其中執(zhí)行返回在其中執(zhí)行DDL操作的數(shù)操作的數(shù)據(jù)字典對(duì)象的所有者據(jù)字典對(duì)象的所有者ORA_DICT_OBJ_TYPEVARCHAR2

24、(20)CREATE, ALTER, DROP返回在其上執(zhí)行返回在其上執(zhí)行DDL操作的數(shù)操作的數(shù)據(jù)字典對(duì)象的類(lèi)型據(jù)字典對(duì)象的類(lèi)型ORA_INSTANCE_NUMNUMBER所有事件所有事件返回?cái)?shù)據(jù)庫(kù)實(shí)例數(shù)返回?cái)?shù)據(jù)庫(kù)實(shí)例數(shù)ORA_IS_SERVERERRORBOOLEANSERVERERROR以一個(gè)錯(cuò)誤號(hào)為參數(shù),如果錯(cuò)以一個(gè)錯(cuò)誤號(hào)為參數(shù),如果錯(cuò)誤堆棧中有這個(gè)錯(cuò)誤號(hào),該函誤堆棧中有這個(gè)錯(cuò)誤號(hào),該函數(shù)返回?cái)?shù)返回TRUEORA_LOGIN_USERVARCHAR2(30)所有事件所有事件返回已登錄用戶名返回已登錄用戶名ORA_SERVER_ERRORNUMBERSERVERERROR返回錯(cuò)誤堆棧中給定

25、位置上的返回錯(cuò)誤堆棧中給定位置上的錯(cuò)誤編號(hào)錯(cuò)誤編號(hào)ORA_SYSEVENTVARCHAR2(20)所有事件所有事件觸發(fā)該觸發(fā)器的系統(tǒng)事件名觸發(fā)該觸發(fā)器的系統(tǒng)事件名create or replace trigger tr_logCreations after create on schemabegin insert into ddl_creations(user_id, object_type, object_name, object_owner, creation_time) values(user, ora_dict_obj_type, ora_dict_obj_name, ora_dict

26、_obj_owner, sysdate); end; 【例【例13-8】創(chuàng)建系統(tǒng)觸發(fā)器,記錄創(chuàng)建模式】創(chuàng)建系統(tǒng)觸發(fā)器,記錄創(chuàng)建模式對(duì)象的相關(guān)信息。對(duì)象的相關(guān)信息。系統(tǒng)觸發(fā)器和事務(wù)系統(tǒng)觸發(fā)器和事務(wù) n根據(jù)觸發(fā)事件的不同,系統(tǒng)觸發(fā)器事務(wù)的行為方根據(jù)觸發(fā)事件的不同,系統(tǒng)觸發(fā)器事務(wù)的行為方式也有所不同。系統(tǒng)觸發(fā)器要么以獨(dú)立事務(wù)(該式也有所不同。系統(tǒng)觸發(fā)器要么以獨(dú)立事務(wù)(該獨(dú)立事務(wù)會(huì)在觸發(fā)器成功完成后提交)的形式激獨(dú)立事務(wù)會(huì)在觸發(fā)器成功完成后提交)的形式激活,要么就以當(dāng)前用戶事務(wù)的部分事務(wù)的形式進(jìn)活,要么就以當(dāng)前用戶事務(wù)的部分事務(wù)的形式進(jìn)行激活。行激活。nSTARTUPSTARTUP,SHUTDOWNS

27、HUTDOWN,SEVERERRORSEVERERROR和和LOGONLOGON觸發(fā)器觸發(fā)器會(huì)以獨(dú)立事務(wù)的形式激活,而會(huì)以獨(dú)立事務(wù)的形式激活,而LOGOFFLOGOFF和和DDLDDL觸發(fā)器觸發(fā)器則會(huì)以當(dāng)前用戶事務(wù)的部分事務(wù)的形式進(jìn)行激活。則會(huì)以當(dāng)前用戶事務(wù)的部分事務(wù)的形式進(jìn)行激活。系統(tǒng)觸發(fā)器和事務(wù)系統(tǒng)觸發(fā)器和事務(wù) n觸發(fā)器所執(zhí)行的工作一般都會(huì)被無(wú)條件地提交。觸發(fā)器所執(zhí)行的工作一般都會(huì)被無(wú)條件地提交。在在DDLDDL觸發(fā)器中,當(dāng)前事務(wù)(也就是觸發(fā)器中,當(dāng)前事務(wù)(也就是CREATECREATE、ALTERALTER或或DROPDROP語(yǔ)句)將自動(dòng)提交,而這種提交也提語(yǔ)句)將自動(dòng)提交,而這種提交也

28、提交了觸發(fā)器所完成的工作。交了觸發(fā)器所完成的工作。LOGOFFLOGOFF觸發(fā)器中的工觸發(fā)器中的工作,也會(huì)以會(huì)話中最后一個(gè)事務(wù)的部分事務(wù)的形作,也會(huì)以會(huì)話中最后一個(gè)事務(wù)的部分事務(wù)的形式被提交。式被提交。 n注意:注意:無(wú)論如何系統(tǒng)觸發(fā)器一般都會(huì)被提交,所無(wú)論如何系統(tǒng)觸發(fā)器一般都會(huì)被提交,所以將它們聲明為自治事務(wù)沒(méi)有什么意義。以將它們聲明為自治事務(wù)沒(méi)有什么意義。系統(tǒng)觸發(fā)器和系統(tǒng)觸發(fā)器和WHEN子句子句 n系統(tǒng)觸發(fā)器也可以使用系統(tǒng)觸發(fā)器也可以使用 WHEN WHEN 子句來(lái)指定觸發(fā)器子句來(lái)指定觸發(fā)器激活的條件。激活的條件。n對(duì)每一種系統(tǒng)觸發(fā)器所指定的條件類(lèi)型有如下限對(duì)每一種系統(tǒng)觸發(fā)器所指定的條件類(lèi)

29、型有如下限制:制:nSTARTUP STARTUP 和和 SHUTDOWN SHUTDOWN 觸發(fā)器不能帶有任何條件。觸發(fā)器不能帶有任何條件。nSERVERERROR SERVERERROR 觸發(fā)器只可以使用觸發(fā)器只可以使用 ERRNO ERRNO 測(cè)試來(lái)檢查具測(cè)試來(lái)檢查具體錯(cuò)誤。體錯(cuò)誤。nLOGON LOGON 和和 LOGOFF LOGOFF 觸發(fā)器可以使用觸發(fā)器可以使用 USERID USERID 或或 USERNAME USERNAME 測(cè)試來(lái)檢查用戶標(biāo)識(shí)符或用戶名。測(cè)試來(lái)檢查用戶標(biāo)識(shí)符或用戶名。nDDL DDL 觸發(fā)器可以檢查正在被修改的對(duì)象的名稱(chēng)和類(lèi)型,觸發(fā)器可以檢查正在被修改的對(duì)

30、象的名稱(chēng)和類(lèi)型,也可以檢查用戶的也可以檢查用戶的 ID ID 或名稱(chēng)?;蛎Q(chēng)。 其他觸發(fā)器問(wèn)題其他觸發(fā)器問(wèn)題 n觸發(fā)器名稱(chēng)的命名空間(觸發(fā)器名稱(chēng)的命名空間(Name-space)n使用觸發(fā)器的各種限制和不同種類(lèi)的觸發(fā)使用觸發(fā)器的各種限制和不同種類(lèi)的觸發(fā)器體。器體。n與觸發(fā)器有關(guān)的權(quán)限問(wèn)題與觸發(fā)器有關(guān)的權(quán)限問(wèn)題 觸發(fā)器名稱(chēng)觸發(fā)器名稱(chēng) n命名空間:是一組合法的可供對(duì)象作為名字使用命名空間:是一組合法的可供對(duì)象作為名字使用的標(biāo)識(shí)符。過(guò)程、包和表都共享同一個(gè)命名空間,的標(biāo)識(shí)符。過(guò)程、包和表都共享同一個(gè)命名空間,在一個(gè)數(shù)據(jù)庫(kù)模式范圍內(nèi),同一命名空間內(nèi)的所在一個(gè)數(shù)據(jù)庫(kù)模式范圍內(nèi),同一命名空間內(nèi)的所有的對(duì)象

31、必須具有唯一的名稱(chēng)。有的對(duì)象必須具有唯一的名稱(chēng)。n觸發(fā)器使用的是一個(gè)獨(dú)立的命名空間。也就是說(shuō),觸發(fā)器使用的是一個(gè)獨(dú)立的命名空間。也就是說(shuō),觸發(fā)器可以有與表和過(guò)程相同的名稱(chēng)。然而,在觸發(fā)器可以有與表和過(guò)程相同的名稱(chēng)。然而,在一個(gè)模式范圍內(nèi),給定的名稱(chēng)只能用于一個(gè)觸發(fā)一個(gè)模式范圍內(nèi),給定的名稱(chēng)只能用于一個(gè)觸發(fā)器。器。 n提示:提示:雖然觸發(fā)器可以與表同名,但建議一般不雖然觸發(fā)器可以與表同名,但建議一般不要這樣使用。要這樣使用。對(duì)觸發(fā)器的限制對(duì)觸發(fā)器的限制n注意事項(xiàng)注意事項(xiàng)n觸發(fā)器不會(huì)執(zhí)行事務(wù)控制語(yǔ)句觸發(fā)器不會(huì)執(zhí)行事務(wù)控制語(yǔ)句n觸發(fā)器調(diào)用的任何函數(shù)或者過(guò)程不會(huì)執(zhí)行事務(wù)觸發(fā)器調(diào)用的任何函數(shù)或者過(guò)程不會(huì)執(zhí)行事務(wù)控制語(yǔ)句控制語(yǔ)句n不允許在觸發(fā)器體中聲明不允許在觸發(fā)器體中聲明LONG或者或者LONG RAW變量變量n如果刪除一個(gè)表,則在該表上所定義的數(shù)據(jù)庫(kù)如果刪除一個(gè)表,則在該表上所定義的數(shù)據(jù)庫(kù)觸發(fā)器也會(huì)被刪除觸發(fā)器也會(huì)被刪除觸發(fā)器主體觸發(fā)器主體 n在在Oracle8i之前的版本中,觸發(fā)器主體必須是之前的版本中,觸發(fā)器主體必須是PL/SQL語(yǔ)句塊。語(yǔ)句塊。n在在Oracle8i及更高版本中,觸發(fā)器主體可以包括及更高版本中,觸發(fā)器主體可以包括CALL語(yǔ)句。被調(diào)用的過(guò)程既可以是語(yǔ)句。被調(diào)用的過(guò)程既可以是PL/SQL存儲(chǔ)存儲(chǔ)子程序,也可以是

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論