專題八-觸發(fā)器_第1頁
專題八-觸發(fā)器_第2頁
專題八-觸發(fā)器_第3頁
專題八-觸發(fā)器_第4頁
專題八-觸發(fā)器_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列專題八專題八 觸發(fā)器觸發(fā)器 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列回顧回顧l過程和函數(shù)都是命名的過程和函數(shù)都是命名的PL/SQL程序塊,合稱子程序程序塊,合稱子程序l過程有三種參數(shù)模式:過程有三種參數(shù)模式:IN、OUT和和IN OUTl過程用戶執(zhí)行特定的任務(wù),函數(shù)用于執(zhí)行任務(wù)并返過程用戶執(zhí)行特定的任務(wù),函數(shù)用于執(zhí)行任務(wù)并返回值回值l過程與函數(shù)的相同點(diǎn)和不同點(diǎn)過程與函數(shù)的相同點(diǎn)和不同點(diǎn)l程序包是對(duì)過程、函數(shù)、變量、常量、游標(biāo)、異常程序包是對(duì)過程、函數(shù)、變量、常量、游標(biāo)、異常及及PL/SQL數(shù)據(jù)類型等的封裝數(shù)據(jù)類型等的封裝 l程序包由兩部分組成,即包規(guī)范

2、和包主體程序包由兩部分組成,即包規(guī)范和包主體l使用程序包的優(yōu)點(diǎn)使用程序包的優(yōu)點(diǎn) Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列教學(xué)目標(biāo)l了解觸發(fā)器的概念和作用了解觸發(fā)器的概念和作用l理解觸發(fā)器的設(shè)計(jì)原則理解觸發(fā)器的設(shè)計(jì)原則l掌握觸發(fā)器的組成部分掌握觸發(fā)器的組成部分l熟練使用熟練使用DML觸發(fā)器觸發(fā)器l了解了解INSTEAD OF觸發(fā)器和系統(tǒng)觸發(fā)器觸發(fā)器和系統(tǒng)觸發(fā)器l掌握觸發(fā)器的查看、禁用、激活和刪除掌握觸發(fā)器的查看、禁用、激活和刪除 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列工作任務(wù) l1 使用使用BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器l2 使用使用AFTER行級(jí)觸發(fā)器行級(jí)觸發(fā)器l3 使用使用BEFORE語

3、句級(jí)觸發(fā)器語句級(jí)觸發(fā)器l4 使用使用AFTER語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器l5 使用使用INSTEAD OF觸發(fā)器觸發(fā)器l6 使用使用DDL觸發(fā)器觸發(fā)器l7 使用數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器使用數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器l8 使用用戶登錄和退出觸發(fā)器使用用戶登錄和退出觸發(fā)器l9 管理觸發(fā)器管理觸發(fā)器 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列相關(guān)實(shí)踐知識(shí)相關(guān)實(shí)踐知識(shí)l觸發(fā)器觸發(fā)器是當(dāng)某一事件發(fā)生時(shí)自動(dòng)執(zhí)行的特殊的是當(dāng)某一事件發(fā)生時(shí)自動(dòng)執(zhí)行的特殊的過程,利用它我們可以實(shí)現(xiàn)復(fù)雜的約束和業(yè)務(wù)過程,利用它我們可以實(shí)現(xiàn)復(fù)雜的約束和業(yè)務(wù)邏輯,實(shí)現(xiàn)更高的數(shù)據(jù)安全性。邏輯,實(shí)現(xiàn)更高的數(shù)據(jù)安全性。 Hands-On實(shí)訓(xùn)教程系列

4、實(shí)訓(xùn)教程系列BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器 l公司規(guī)定,如果給員工加薪,每次的加公司規(guī)定,如果給員工加薪,每次的加薪比例不能超過本人原工資的薪比例不能超過本人原工資的10%,為,為實(shí)現(xiàn)這一功能,可以在表實(shí)現(xiàn)這一功能,可以在表emp上建立一上建立一個(gè)個(gè)BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器(DML觸發(fā)器觸發(fā)器中中的一種)。的一種)。l1. 從開始菜單中打開從開始菜單中打開SQL*Plus工具,以工具,以SCOTT用戶的身份登錄到數(shù)據(jù)庫。用戶的身份登錄到數(shù)據(jù)庫。l2. 在在SQL提示符下輸入如下的代碼來創(chuàng)提示符下輸入如下的代碼來創(chuàng)建觸發(fā)器。建觸發(fā)器。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFOR

5、E行級(jí)觸發(fā)器行級(jí)觸發(fā)器lCREATE OR REPLACE TRIGGER tr_emp_bef_rowlBEFORE UPDATE OF sallON emplFOR EACH ROWlDECLAREll_scale NUMBER;lBEGINll_scale:=(:NEW.sal-:OLD.sal)/:OLD.sal;lIF l_scale0.1 THENlDBMS_OUTPUT.PUT_LINE(對(duì)不起對(duì)不起,員工的加薪比例不能超過員工的加薪比例不能超過10%!);l:NEW.sal:=:OLD.sal*1.1;lEND IF;lEND TRIGGER;l/ Hands-On實(shí)訓(xùn)教程系列

6、實(shí)訓(xùn)教程系列BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器l3. 按回車鍵后,系統(tǒng)提示按回車鍵后,系統(tǒng)提示“觸發(fā)器已創(chuàng)建觸發(fā)器已創(chuàng)建”,說明觸發(fā)器創(chuàng)建成功。說明觸發(fā)器創(chuàng)建成功。l4. 假如現(xiàn)在要給編號(hào)是假如現(xiàn)在要給編號(hào)是7369的員工加薪。先的員工加薪。先用如下的查詢語句查看一下他的原工資。用如下的查詢語句查看一下他的原工資。 SELECT empno,sal FROM emp WHERE empno=7369;l可以查出編號(hào)是可以查出編號(hào)是7369的員工的原工資是的員工的原工資是800。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器l5. 計(jì)劃給該員工加薪到計(jì)劃給該員工加薪到1

7、000,用如下的,用如下的UPDATE語句修改。語句修改。 UPDATE emp SET sal=1000 WHERE empno=7369;l6. 按回車后,系統(tǒng)提示按回車后,系統(tǒng)提示“對(duì)不起對(duì)不起,員工的加薪員工的加薪比例不能超過比例不能超過10%!“和和”已更新一行已更新一行”,再同,再同第第4步相同的查詢語句,查看該員工的工資,步相同的查詢語句,查看該員工的工資,結(jié)果如圖所示。結(jié)果如圖所示。l從圖中可以看出,該員工的工資被修改為從圖中可以看出,該員工的工資被修改為880,而不是而不是1000,觸發(fā)器被執(zhí)行。,觸發(fā)器被執(zhí)行。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE行級(jí)觸發(fā)器

8、行級(jí)觸發(fā)器l7. 假定現(xiàn)在公司的規(guī)定變?yōu)椋褐挥性べY高于假定現(xiàn)在公司的規(guī)定變?yōu)椋褐挥性べY高于1500的員工加薪才不能超過的員工加薪才不能超過10%,低于,低于 1000的不再受此的不再受此限制??稍诘谙拗???稍诘?步的創(chuàng)建觸發(fā)器的代碼中,在步的創(chuàng)建觸發(fā)器的代碼中,在FOR EACH ROW子句的后面加入如下觸發(fā)條件。子句的后面加入如下觸發(fā)條件。WHEN (OLD.sal1500)l8. 創(chuàng)建觸發(fā)器成功后,繼續(xù)用如下的創(chuàng)建觸發(fā)器成功后,繼續(xù)用如下的UPDATE語句語句想把編號(hào)是想把編號(hào)是7369的員工的工資改為的員工的工資改為1000。UPDATE emp SET sal=1000 WHERE

9、 empno=7369; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器l9. 語句執(zhí)行后系統(tǒng)提示語句執(zhí)行后系統(tǒng)提示“已更新一行已更新一行”,再用語句,再用語句查詢可以查出該員工的工資被更新為查詢可以查出該員工的工資被更新為1000。而不是。而不是8801.1=968,可見因?yàn)橛|發(fā)條件的限制,觸發(fā)器,可見因?yàn)橛|發(fā)條件的限制,觸發(fā)器內(nèi)的觸發(fā)操作語句并沒有被執(zhí)行。內(nèi)的觸發(fā)操作語句并沒有被執(zhí)行。l10. 如果把創(chuàng)建觸發(fā)器的代碼中的如果把創(chuàng)建觸發(fā)器的代碼中的“BEFORE”改為改為“AFTER”,按回車后將會(huì)出現(xiàn)如圖所示的結(jié)果。,按回車后將會(huì)出現(xiàn)如圖所示的結(jié)果。l由此可見,只

10、能在由此可見,只能在BEFORE行級(jí)觸發(fā)器中重新設(shè)置行級(jí)觸發(fā)器中重新設(shè)置NEW值,而不能在值,而不能在AFTER觸發(fā)器中更改觸發(fā)器中更改NEW值。值。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列AFTER行級(jí)觸發(fā)器行級(jí)觸發(fā)器 l現(xiàn)要審計(jì)員工的工資變動(dòng)情況,用一個(gè)表來記現(xiàn)要審計(jì)員工的工資變動(dòng)情況,用一個(gè)表來記錄相關(guān)信息,利用錄相關(guān)信息,利用AFTER行級(jí)觸發(fā)器行級(jí)觸發(fā)器向表中向表中插入數(shù)據(jù)。插入數(shù)據(jù)。l1. 以以SCOTT用戶身份登錄到數(shù)據(jù)庫后,建立用戶身份登錄到數(shù)據(jù)庫后,建立記錄工資變動(dòng)情況的表記錄工資變動(dòng)情況的表t_em_sal_change,在在SQL提示符下輸入如下的建表語句。提示符下輸入

11、如下的建表語句。lCREATE TABLE t_emp_sal_changel(ltime DATE,lempno NUMBER(4),loldsal NUMBER(7,2),lnewsal NUMBER(7,2)l); Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列AFTER行級(jí)觸發(fā)器行級(jí)觸發(fā)器l2. 在在SQL提示符下,輸入以下的代碼來創(chuàng)建提示符下,輸入以下的代碼來創(chuàng)建AFTER行級(jí)觸發(fā)器。行級(jí)觸發(fā)器。lCREATE OR REPLACE TRIGGER tr_emp_aft_rowlAFTER UPDATE OF sallON emplFOR EACH ROWlBEGINlINSERT INT

12、O t_emp_sal_change lVALUES(systimestamp,:OLD.empno,:OLD.sal,:NEW.sal);lEND TRIGGER;l/ Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列AFTER行級(jí)觸發(fā)器行級(jí)觸發(fā)器l3. 修改部門編號(hào)是修改部門編號(hào)是10的所有員工的工資,給的所有員工的工資,給每人加薪每人加薪100。UPDATE emp SET sal=sal+100 WHERE deptno=10;l4. 語句執(zhí)行后系統(tǒng)提示語句執(zhí)行后系統(tǒng)提示“已更新已更新3行行”,再用,再用SELECT語句查詢表語句查詢表t_em_sal_ch-ange內(nèi)的內(nèi)的信息,如圖所示。信

13、息,如圖所示。l可見,利用可見,利用AFTER行級(jí)觸發(fā)器,員工工資的行級(jí)觸發(fā)器,員工工資的變動(dòng)情況被自動(dòng)記錄到表變動(dòng)情況被自動(dòng)記錄到表t_emp_sal_change中,實(shí)現(xiàn)了對(duì)工資變動(dòng)情況的審計(jì)。中,實(shí)現(xiàn)了對(duì)工資變動(dòng)情況的審計(jì)。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器lemp表中包括員工工資等敏感數(shù)據(jù),為了防止表中包括員工工資等敏感數(shù)據(jù),為了防止有人隨意修改,公司規(guī)定只有有人隨意修改,公司規(guī)定只有SCOTT用戶才用戶才有權(quán)修改此表,現(xiàn)通過在有權(quán)修改此表,現(xiàn)通過在emp表上建立表上建立BEFORE語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器來實(shí)現(xiàn)此功能。來實(shí)現(xiàn)此功能。l1.

14、以以SCOTT用戶身份登錄到數(shù)據(jù)庫后,在用戶身份登錄到數(shù)據(jù)庫后,在SQL提示符下,輸入以下的代碼來創(chuàng)建提示符下,輸入以下的代碼來創(chuàng)建BE-FORE語句級(jí)觸發(fā)器。語句級(jí)觸發(fā)器。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器lCREATE TRIGGER tr_emp_beflBEFORE INSERT OR UPDATE OR DELETElON emplBEGINlIF user NOT IN (SCOTT) THENlRAISE_APPLICATION_ERROR(-20001,您無權(quán)修改您無權(quán)修改emp表表);lEND IF;lEND TRIGGER;l/

15、Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器l2. 系統(tǒng)提示系統(tǒng)提示“觸發(fā)器已創(chuàng)建觸發(fā)器已創(chuàng)建“后,為了測(cè)試后,為了測(cè)試觸發(fā)器是否能真正實(shí)現(xiàn)功能,在觸發(fā)器是否能真正實(shí)現(xiàn)功能,在SQL提示符下提示符下輸入如下的代碼,以輸入如下的代碼,以SYSDBA身份登錄到數(shù)身份登錄到數(shù)據(jù)庫。據(jù)庫。CONNECT / AS SYSDBA;l3. 系統(tǒng)管理員想向表系統(tǒng)管理員想向表emp中插入一條記錄,中插入一條記錄,在在SQL提示符下輸入如下的代碼。提示符下輸入如下的代碼。INSERT INTO emp(empno,ename) VALUES(8888,aaa); Hands-On

16、實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器l4. 按回車后系統(tǒng)出現(xiàn)如圖所示的錯(cuò)誤提示。按回車后系統(tǒng)出現(xiàn)如圖所示的錯(cuò)誤提示。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器l5. 在在SQL提示符下,輸入如下的代碼,以提示符下,輸入如下的代碼,以SCOTT用戶的身份登錄到數(shù)據(jù)庫。用戶的身份登錄到數(shù)據(jù)庫。CONNECT SCOTT/TIGER;l6. 輸入與上面第輸入與上面第3步相同的代碼,系統(tǒng)提示步相同的代碼,系統(tǒng)提示“已創(chuàng)建一行已創(chuàng)建一行”,說明操作成功。,說明操作成功。l從以上的操作可以看出,加上此從以上的操作可以看出,加上此BEFORE語語句

17、級(jí)觸發(fā)器后,不允許除句級(jí)觸發(fā)器后,不允許除SCOTT用戶之外的用戶之外的其他任何用戶修改表其他任何用戶修改表emp,即使管理員也不行。,即使管理員也不行。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列AFTER語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器 l為了審計(jì)數(shù)據(jù)庫用戶對(duì)表為了審計(jì)數(shù)據(jù)庫用戶對(duì)表emp所做的所做的DML操操作,可以用作,可以用AFTER語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器來實(shí)現(xiàn)此功來實(shí)現(xiàn)此功能。能。l1. 以以SCOTT用戶的身份登錄到數(shù)據(jù)庫,在用戶的身份登錄到數(shù)據(jù)庫,在SQL提示符下,輸入如下的代碼,創(chuàng)建記錄提示符下,輸入如下的代碼,創(chuàng)建記錄DML操作的表操作的表t_emp_dml。lCREATE TAB

18、LE t_emp_dmll(lwho VARCHAR2(10),lwhen DATE,loperater VARCHAR2(10)l); Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列AFTER語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器l2. 輸入如下的代碼創(chuàng)建輸入如下的代碼創(chuàng)建AFTER語句級(jí)觸發(fā)器。語句級(jí)觸發(fā)器。lCREATE OR REPLACE TRIGGER tr_emp_aftlAFTER INSERT OR UPDATE OR DELETElON emplBEGINlCASElWHEN INSERTING THENlINSERT INTO t_emp_dml VALUES(user,sysdate,IN

19、SERT);lWHEN UPDATING THENlINSERT INTO t_emp_dml VALUES(user,sysdate,UPDATE);lWHEN DELETING THENlINSERT INTO t_emp_dml VALUES(user,sysdate,DELETE);lEND CASE;lEND TRIGGER;l/ Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列AFTER語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器l3. 按回車系統(tǒng)提示按回車系統(tǒng)提示“觸發(fā)器已創(chuàng)建觸發(fā)器已創(chuàng)建”后,為后,為驗(yàn)證其功能,在驗(yàn)證其功能,在SQL提示符下按如下的代碼所提示符下按如下的代碼所示輸入一些測(cè)試數(shù)據(jù)。示輸入一

20、些測(cè)試數(shù)據(jù)。l4. 用如下的用如下的SELECT語句查詢表語句查詢表t_emp_dml的內(nèi)容。的內(nèi)容。SELECT * FROM t_emp_dml;lINSERT INTO emp(empno,ename) VALUES(1000,TEST1);lINSERT INTO emp(empno,ename) VALUES(1000,TEST2);lUPDATE emp SET ename=TEST3 WHERE empno=1000;lDELETE FROM emp WHERE empno=1000 OR empno=1001; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列AFTER語句級(jí)觸發(fā)器語句

21、級(jí)觸發(fā)器l5. 查詢結(jié)果如圖所示。查詢結(jié)果如圖所示。l可以看出,表可以看出,表t_emp_dml記錄了對(duì)表記錄了對(duì)表emp的的DML操操作。請(qǐng)注意上面第作。請(qǐng)注意上面第3步中的步中的DELETE語句盡管一次刪語句盡管一次刪除了兩條記錄,但因?yàn)槭钦Z句級(jí)觸發(fā)器而非行級(jí)觸除了兩條記錄,但因?yàn)槭钦Z句級(jí)觸發(fā)器而非行級(jí)觸發(fā)器,所以只在表發(fā)器,所以只在表t_emp_dml添加了一條信息。添加了一條信息。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列INSTEAD OF觸發(fā)器觸發(fā)器 l本例演示了本例演示了INSTEAD OF觸發(fā)器觸發(fā)器 的使用方法的使用方法l1. 基于表基于表emp和和dept創(chuàng)建視圖創(chuàng)建視圖v

22、_dept_emp,如下面的代碼所示。如下面的代碼所示。l2. 視圖創(chuàng)建完成后,可以正常地執(zhí)行查詢語視圖創(chuàng)建完成后,可以正常地執(zhí)行查詢語句。如可以用下面的代碼來查詢視圖。句。如可以用下面的代碼來查詢視圖。SELECT * FROM v_dept_emp;lCREATE OR REPLACE VIEW v_dept_empASSELECT d.deptno,d.dname,e.empno,e.enameFROM dept d,emp eWHERE d.deptno=e.deptno; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列INSTEAD OF觸發(fā)器觸發(fā)器l查詢結(jié)果如圖所示。查詢結(jié)果如圖所示。l

23、3. 但是,如果想用如下的但是,如果想用如下的INSERT語句直接向語句直接向視圖中插入數(shù)據(jù)則會(huì)報(bào)錯(cuò)。視圖中插入數(shù)據(jù)則會(huì)報(bào)錯(cuò)。INSERT INTO v_dept_emp VALUES(10,ACCOUNTING,2222,TOM); Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列INSTEAD OF觸發(fā)器觸發(fā)器l錯(cuò)誤結(jié)果如圖所示。錯(cuò)誤結(jié)果如圖所示。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列INSTEAD OF觸發(fā)器觸發(fā)器l4. 假如我們事先建立了如下所示的假如我們事先建立了如下所示的INSTEAD OF觸發(fā)器,則不會(huì)出錯(cuò)。觸發(fā)器,則不會(huì)出錯(cuò)。lCREATE OR REPLACE TRIGGER t

24、r_v_dept_emp_inf_rowlINSTEAD OF INSERTlON v_dept_emplFOR EACH ROWlDECLAREll_temp PLS_INTEGER;lBEGINlSELECT COUNT(*) INTO l_temp FROM dept WHERE deptno=:NEW.deptno;lIF l_temp=0 THENlINSERT INTO dept(deptno,dname) VALUES(:NEW.deptno,:NEW.dname);lEND IF;lSELECT COUNT(*) INTO l_temp FROM emp WHERE empno

25、=:NEW.empno;lIF l_temp=0 THENlINSERT INTO emp(empno,ename,deptno)lVALUES(:NEW.empno,:NEW.ename,:NEW.deptno);lEND IF;lEND TRIGGER;l/ Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列INSTEAD OF觸發(fā)器觸發(fā)器l5. 系統(tǒng)提示系統(tǒng)提示“觸發(fā)器已創(chuàng)建觸發(fā)器已創(chuàng)建”后,再輸入與后,再輸入與第第3步相同的步相同的INSERT語句,系統(tǒng)提示語句,系統(tǒng)提示“已創(chuàng)已創(chuàng)建一行建一行”,不再報(bào)錯(cuò)。,不再報(bào)錯(cuò)。l6. 分別查詢視圖分別查詢視圖v_dept_emp和表和表dept、emp的

26、記錄,如圖所示。的記錄,如圖所示。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列INSTEAD OF觸發(fā)器觸發(fā)器l從圖中可以看出,視圖中多了一條記錄。從圖中可以看出,視圖中多了一條記錄。dept表中因?yàn)樵瓉砭陀芯幪?hào)是表中因?yàn)樵瓉砭陀芯幪?hào)是10的部門,因的部門,因此并沒有新的數(shù)據(jù)被添加。表此并沒有新的數(shù)據(jù)被添加。表emp中添加了一中添加了一條記錄。實(shí)際上,通過條記錄。實(shí)際上,通過INSTEAD OF觸發(fā)器,觸發(fā)器,對(duì)視圖的操作轉(zhuǎn)化為了對(duì)基表的操作。對(duì)視圖的操作轉(zhuǎn)化為了對(duì)基表的操作。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列DDL觸發(fā)器觸發(fā)器 l如果某個(gè)表非常重要,不允許被刪除,可以創(chuàng)如果某個(gè)表非常重

27、要,不允許被刪除,可以創(chuàng)建建DDL觸發(fā)器觸發(fā)器(系統(tǒng)觸發(fā)器系統(tǒng)觸發(fā)器中的一種)來阻止中的一種)來阻止用戶的刪除操作。用戶的刪除操作。l1. 以以SYSDBA身份登錄到數(shù)據(jù)庫,在身份登錄到數(shù)據(jù)庫,在SQL提提示符下,輸入如下的代碼來創(chuàng)建一個(gè)表示符下,輸入如下的代碼來創(chuàng)建一個(gè)表t_test。CREATE TABLE t_test(id NUMBER); l2. 假定這個(gè)表不允許被刪除,可以輸入如下假定這個(gè)表不允許被刪除,可以輸入如下的代碼來創(chuàng)建的代碼來創(chuàng)建DDL觸發(fā)器,請(qǐng)注意必須用觸發(fā)器,請(qǐng)注意必須用BEFORE關(guān)鍵字,不能是關(guān)鍵字,不能是AFTER的。的。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系

28、列DDL觸發(fā)器觸發(fā)器l其中的其中的ora_dict_obj_name是系統(tǒng)事件屬性是系統(tǒng)事件屬性函數(shù),它返回函數(shù),它返回DDL操作所對(duì)應(yīng)的數(shù)據(jù)庫對(duì)象名。操作所對(duì)應(yīng)的數(shù)據(jù)庫對(duì)象名。lCREATE OR REPLACE TRIGGER tr_t_test_ddllBEFORE DROP ON SCHEMAlBEGINlIF ora_dict_obj_name=T_TEST THEN lRAISE_APPLICATION_ERROR(-20003,表表t_test不允不允許被刪除許被刪除!);lEND IF;lEND TRIGGER;l/ Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列DDL觸發(fā)器觸發(fā)器l

29、3. 創(chuàng)建此觸發(fā)器后,用戶如果執(zhí)行了刪除表創(chuàng)建此觸發(fā)器后,用戶如果執(zhí)行了刪除表t_test的操作的操作“DROP TABLE t_test;”,將會(huì),將會(huì)出現(xiàn)如圖所示的錯(cuò)誤,提示表不允許被刪除。出現(xiàn)如圖所示的錯(cuò)誤,提示表不允許被刪除。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列 DDL觸發(fā)器觸發(fā)器l4. 以以SYSDBA身份登錄到數(shù)據(jù)庫,執(zhí)行如下的刪除身份登錄到數(shù)據(jù)庫,執(zhí)行如下的刪除表的操作。表的操作。DROP TABLE scott.t_test;l5. 系統(tǒng)會(huì)提示系統(tǒng)會(huì)提示“表已刪除表已刪除”。這是因?yàn)樯厦鎰?chuàng)建的。這是因?yàn)樯厦鎰?chuàng)建的觸發(fā)器是模式級(jí)的,即只有在觸發(fā)器是模式級(jí)的,即只有在SCOT

30、T用戶模式下,用戶模式下,觸發(fā)器才起作用。如果想讓觸發(fā)器才起作用。如果想讓SYSDBA也不能刪除表也不能刪除表t_test,需要以,需要以SYSDBA身份登錄到數(shù)據(jù)庫后,把觸身份登錄到數(shù)據(jù)庫后,把觸發(fā)器創(chuàng)建成數(shù)據(jù)庫級(jí)的,即在創(chuàng)建觸發(fā)器代碼中把發(fā)器創(chuàng)建成數(shù)據(jù)庫級(jí)的,即在創(chuàng)建觸發(fā)器代碼中把“SCHEMA”改成改成“DATABASE”。l6. 修改完成后,再試一下第修改完成后,再試一下第4步的刪除表的語句,也步的刪除表的語句,也將提示將提示“表表t_test不允許被刪除不允許被刪除”。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器 l1. 以以SYSDBA身份

31、登錄到數(shù)據(jù)庫。身份登錄到數(shù)據(jù)庫。l2. 為了記載數(shù)據(jù)庫啟動(dòng)和關(guān)閉情況,先創(chuàng)建為了記載數(shù)據(jù)庫啟動(dòng)和關(guān)閉情況,先創(chuàng)建一個(gè)表一個(gè)表t_db_event。lCREATE TABLE t_db_eventl(ltime DATE,levent VARCHAR2(10)l); Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器l3. 創(chuàng)建創(chuàng)建數(shù)據(jù)庫啟動(dòng)觸發(fā)器數(shù)據(jù)庫啟動(dòng)觸發(fā)器。l4. 創(chuàng)建創(chuàng)建數(shù)據(jù)庫關(guān)閉觸發(fā)器數(shù)據(jù)庫關(guān)閉觸發(fā)器。lCREATE OR REPLACE TRIGGER tr_startuplAFTER STARTUP ON DATABASElBEGINlINSER

32、T INTO t_db_event VALUES(sysdate,STARTUP);lEND; lCREATE OR REPLACE TRIGGER tr_shutdownlBEFORE SHUTDOWN ON DATABASElBEGINlINSERT INTO t_db_event VALUES(sysdate,SHUTDOWN);lEND; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器l5. 用如下的代碼,依次關(guān)閉和打開數(shù)據(jù)庫。用如下的代碼,依次關(guān)閉和打開數(shù)據(jù)庫。SQLSHUTDOWN IMMEDIATESQLSTARTUPl6. 用如下的用如下的

33、SELECT語句查詢查詢語句查詢查詢t_db_event表的信息。表的信息。SELECT TO_CHAR(time,YYYY-MM-DD HH24:MI:SS) AS ope_time,event FROM t_db_event;l查詢結(jié)果如圖所示。查詢結(jié)果如圖所示。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列用戶登錄和退出觸發(fā)器用戶登錄和退出觸發(fā)器 l1. 以以SYSDBA身份登錄到數(shù)據(jù)庫。身份登錄到數(shù)據(jù)庫。l2. 為了記載用戶登錄和退出情況,先創(chuàng)為了記載用戶登錄和退出情況,先創(chuàng)建一個(gè)表建一個(gè)表t_user_log。lCREATE TABLE t_user_logl(lusername VAR

34、CHAR(20),ltime_logon DATE,ltime_logoff DATEl); Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列用戶登錄和退出觸發(fā)器用戶登錄和退出觸發(fā)器l3. 創(chuàng)建創(chuàng)建用戶登錄觸發(fā)器用戶登錄觸發(fā)器。lCREATE OR REPLACE TRIGGER tr_user_logonlAFTER LOGON ON DATABASElBEGINlINSERT INTO t_user_log(username,time_logon) VALUES(user,sysdate);lEND; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列用戶登錄和退出觸發(fā)器用戶登錄和退出觸發(fā)器l4. 創(chuàng)建用戶

35、退出觸發(fā)器。創(chuàng)建用戶退出觸發(fā)器。lCREATE OR REPLACE TRIGGER tr_user_logofflBEFORE LOGOFF ON DATABASElBEGINlINSERT INTO t_user_log(username,time_logoff) VALUES(user,sysdate);lEND; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列用戶登錄和退出觸發(fā)器用戶登錄和退出觸發(fā)器l5. 在在SQL提示符下輸入如下的代碼。提示符下輸入如下的代碼。CONNECT SCOTT/TIGER;CONNECT / AS SYSDBA;l6. 執(zhí)行如下的執(zhí)行如下的SELECT語句查詢語

36、句查詢t_user_log表的內(nèi)容。表的內(nèi)容。lSELECT username,lTO_CHAR(time_logon,YYYY-MM-DD HH24:MI:SS) AS logon_time,lTO_CHAR(time_logoff,YYYY-MM-DD HH24:MI:SS) AS logoff_time lFROM t_user_log; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列管理觸發(fā)器管理觸發(fā)器 l1. 以以SCOTT身份登錄到數(shù)據(jù)庫。身份登錄到數(shù)據(jù)庫。l2. 先用先用DESC語句查看數(shù)據(jù)字典視圖語句查看數(shù)據(jù)字典視圖user_triggers的結(jié)構(gòu)。的結(jié)構(gòu)。DESC user_tri

37、ggers;l查詢結(jié)果如圖所示。查詢結(jié)果如圖所示。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列管理觸發(fā)器管理觸發(fā)器l3. 用數(shù)據(jù)字典視圖用數(shù)據(jù)字典視圖user_triggers查看基于表查看基于表emp創(chuàng)建的觸發(fā)器。創(chuàng)建的觸發(fā)器。l查詢的結(jié)果如圖所示。查詢的結(jié)果如圖所示。lCOLUMN trigger_name FORMAT A16lCOLUMN triggering_event FORMAT A30 SELECT trigger_name,trigger_type,triggering_event,status FROM user_triggers WHERE table_name=EMP;

38、Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列管理觸發(fā)器管理觸發(fā)器l4. 現(xiàn)因工作需要,想把前面所創(chuàng)建的現(xiàn)因工作需要,想把前面所創(chuàng)建的BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器tr_emp_bef_row臨時(shí)臨時(shí)禁禁用用,可在,可在SQL提示符下輸入如下的語句。提示符下輸入如下的語句。ALTER TRIGGER tr_emp_bef_row DISABLE;l5. 系統(tǒng)提示系統(tǒng)提示“觸發(fā)器已更改觸發(fā)器已更改”,表明觸發(fā)器,表明觸發(fā)器禁用成功。禁用成功。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列管理觸發(fā)器管理觸發(fā)器l6. 把禁用的觸發(fā)把禁用的觸發(fā)tr_emp_bef_row激活激活,輸入如下的代碼。輸入如下的代

39、碼。ALTER TRIGGER tr_emp_bef_row ENABLE;l7. 刪除觸發(fā)器刪除觸發(fā)器tr_emp_bef_row,可在,可在SQL提示符下輸入如下的代碼。提示符下輸入如下的代碼。DROP TRIGGERS trigger_name; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列總結(jié)總結(jié)l觸發(fā)器是當(dāng)某一事件發(fā)生時(shí)自動(dòng)執(zhí)行的特殊的觸發(fā)器是當(dāng)某一事件發(fā)生時(shí)自動(dòng)執(zhí)行的特殊的過程過程l觸發(fā)器的作用觸發(fā)器的作用l觸發(fā)器的設(shè)計(jì)原則觸發(fā)器的設(shè)計(jì)原則l觸發(fā)器的命名觸發(fā)器的命名l觸發(fā)器的組成部分觸發(fā)器的組成部分l觸發(fā)器的類型及各種類型觸發(fā)器的應(yīng)用觸發(fā)器的類型及各種類型觸發(fā)器的應(yīng)用 Hands-On

40、實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列觸發(fā)器觸發(fā)器l觸發(fā)器是當(dāng)某一事件發(fā)生時(shí)自動(dòng)執(zhí)行的特殊的觸發(fā)器是當(dāng)某一事件發(fā)生時(shí)自動(dòng)執(zhí)行的特殊的過程過程l它與過程的主要區(qū)別是:過程是由用戶或應(yīng)用它與過程的主要區(qū)別是:過程是由用戶或應(yīng)用程序顯示調(diào)用的,而觸發(fā)器不能被直接調(diào)用,程序顯示調(diào)用的,而觸發(fā)器不能被直接調(diào)用,當(dāng)特定事件(如修改表內(nèi)數(shù)據(jù)、刪除表或登陸當(dāng)特定事件(如修改表內(nèi)數(shù)據(jù)、刪除表或登陸到數(shù)據(jù)庫等)發(fā)生時(shí),觸發(fā)器被自動(dòng)觸發(fā),執(zhí)到數(shù)據(jù)庫等)發(fā)生時(shí),觸發(fā)器被自動(dòng)觸發(fā),執(zhí)行事先定義好的行事先定義好的PL/SQL塊。塊。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列觸發(fā)器的作用觸發(fā)器的作用 l1. 提高數(shù)據(jù)的安全性。提高數(shù)據(jù)的

41、安全性。l2. 實(shí)現(xiàn)數(shù)據(jù)審計(jì)。實(shí)現(xiàn)數(shù)據(jù)審計(jì)。l3. 實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)完整性規(guī)則。實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)完整性規(guī)則。l4. 實(shí)現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的相關(guān)完整性規(guī)則。實(shí)現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的相關(guān)完整性規(guī)則。l5. 自動(dòng)生成數(shù)據(jù)值。自動(dòng)生成數(shù)據(jù)值。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列觸發(fā)器的設(shè)計(jì)原則觸發(fā)器的設(shè)計(jì)原則 l1. 當(dāng)一個(gè)操作執(zhí)行時(shí),為了確保與其相關(guān)的其它操當(dāng)一個(gè)操作執(zhí)行時(shí),為了確保與其相關(guān)的其它操作也必須執(zhí)行時(shí)可以使用觸發(fā)器。作也必須執(zhí)行時(shí)可以使用觸發(fā)器。l2. 如果能用簡(jiǎn)單約束(主鍵、外鍵、如果能用簡(jiǎn)單約束(主鍵、外鍵、CHECK約束等)約束等)實(shí)現(xiàn)的功能不要使用觸發(fā)器。實(shí)現(xiàn)的功能不要使用觸發(fā)器。l3.

42、 當(dāng)觸發(fā)器的代碼超過當(dāng)觸發(fā)器的代碼超過60行或觸發(fā)器大小超過行或觸發(fā)器大小超過32KB時(shí),應(yīng)先建立過程,再在觸發(fā)器中通過時(shí),應(yīng)先建立過程,再在觸發(fā)器中通過CALL語句調(diào)語句調(diào)用過程。用過程。l4. 不要建立遞歸觸發(fā)器。遞歸觸發(fā)器是指在觸發(fā)器不要建立遞歸觸發(fā)器。遞歸觸發(fā)器是指在觸發(fā)器中執(zhí)行的操作,又直接或間接地觸發(fā)了同一個(gè)觸發(fā)中執(zhí)行的操作,又直接或間接地觸發(fā)了同一個(gè)觸發(fā)器。器。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列觸發(fā)器的命名觸發(fā)器的命名 l在同一個(gè)用戶模式下,觸發(fā)器不允許重名。在同一個(gè)用戶模式下,觸發(fā)器不允許重名。盡管按照規(guī)則觸發(fā)器名可以與其它的數(shù)據(jù)庫盡管按照規(guī)則觸發(fā)器名可以與其它的數(shù)據(jù)庫

43、對(duì)象(表、視圖等)同名,但不建議這么做。對(duì)象(表、視圖等)同名,但不建議這么做。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列觸發(fā)器的組成部分觸發(fā)器的組成部分l 觸發(fā)事件觸發(fā)事件l 觸發(fā)條件觸發(fā)條件l 觸發(fā)操作觸發(fā)操作 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列觸發(fā)器的類型觸發(fā)器的類型lDML觸發(fā)器觸發(fā)器行級(jí)觸發(fā)器行級(jí)觸發(fā)器BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器AFTER行級(jí)觸發(fā)器行級(jí)觸發(fā)器語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器BEFORE語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器AFTER語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器lINSTEAD OF觸發(fā)器觸發(fā)器l系統(tǒng)觸發(fā)器系統(tǒng)觸發(fā)器DDL觸發(fā)器觸發(fā)器數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器數(shù)據(jù)庫啟動(dòng)和關(guān)閉觸發(fā)器用戶登

44、錄和退出觸發(fā)器用戶登錄和退出觸發(fā)器 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列DML觸發(fā)器觸發(fā)器 lDML觸發(fā)器是指在表上建立的由觸發(fā)器是指在表上建立的由DML語語句觸發(fā)的觸發(fā)器。句觸發(fā)的觸發(fā)器。l當(dāng)在表上執(zhí)行當(dāng)在表上執(zhí)行INSERT、U-PDATE或或DELETE等等DML語句時(shí),如果已經(jīng)建立語句時(shí),如果已經(jīng)建立了了DML觸發(fā)器,則觸發(fā)器中的代碼將被觸發(fā)器,則觸發(fā)器中的代碼將被自動(dòng)執(zhí)行。自動(dòng)執(zhí)行。l它的觸發(fā)事件是它的觸發(fā)事件是DML語句。語句。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列DML觸發(fā)器觸發(fā)器l創(chuàng)建創(chuàng)建DML觸發(fā)器的語法為:觸發(fā)器的語法為:lCREATE OR REPLACE TRI

45、GGER trigger_namelBEFORE|AFTERlINSERT|DELETE|UPDATE OF column_listlOR INSERT|DELETE|UPDATE OF column_listlON schema.table_namelREFERENCING NEW AS new_alias OLD AS old_aliaslFOR EACH ROWlWHEN (condition)lPL/SQL Block; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列循環(huán)控制語句循環(huán)控制語句l可以在觸發(fā)器中同時(shí)包含多個(gè)觸發(fā)事件,之間用可以在觸發(fā)器中同時(shí)包含多個(gè)觸發(fā)事件,之間用OR關(guān)鍵字隔開。

46、此時(shí)在觸發(fā)器語句中,如有必要,可關(guān)鍵字隔開。此時(shí)在觸發(fā)器語句中,如有必要,可以使用條件謂詞以使用條件謂詞INSERTING、DELETING和和UPDATING來區(qū)分具體的操作類型。來區(qū)分具體的操作類型。lINSERTING:當(dāng)觸發(fā)事件是:當(dāng)觸發(fā)事件是INSERT時(shí),該條件謂時(shí),該條件謂詞的返回值是詞的返回值是TRUE,否則返回,否則返回FA-LSE;lDELETING:當(dāng)觸發(fā)事件是:當(dāng)觸發(fā)事件是DELETE時(shí),該條件謂時(shí),該條件謂詞的返回值是詞的返回值是TRUE,否則返回,否則返回FA-LSE;lUPDATING:當(dāng)觸發(fā)事件是:當(dāng)觸發(fā)事件是UPDATE時(shí),該條件謂時(shí),該條件謂詞的返回值是詞的

47、返回值是TRUE,否則返回,否則返回FA-LSE; Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列新值和舊值新值和舊值l在行級(jí)觸發(fā)器的語句體中,可以引用在行級(jí)觸發(fā)器的語句體中,可以引用DML語句中涉及的新值語句中涉及的新值和舊值。和舊值。舊值是指在舊值是指在DML語句前存在的數(shù)據(jù)語句前存在的數(shù)據(jù)新值是指由新值是指由DML語句插入或更新進(jìn)去的數(shù)據(jù)語句插入或更新進(jìn)去的數(shù)據(jù)l引用的方式是引用的方式是“:NEW.列名列名”和和“:OLD.列名列名”(注意如果在(注意如果在觸發(fā)器的觸發(fā)條件中引用不能加冒號(hào)),如果為新行或舊行觸發(fā)器的觸發(fā)條件中引用不能加冒號(hào)),如果為新行或舊行起了別名,則用別名代替其中的起了別

48、名,則用別名代替其中的NEW或或OLD。l如果觸發(fā)器是用如果觸發(fā)器是用INSERT語句觸發(fā)的,則只能引用新值。語句觸發(fā)的,則只能引用新值。l如果觸發(fā)器是用如果觸發(fā)器是用DELETE語句觸發(fā)的,則只能引用舊值。語句觸發(fā)的,則只能引用舊值。l如果觸發(fā)器是用如果觸發(fā)器是用UPDATE語句觸發(fā)的,則既可以引用新值,語句觸發(fā)的,則既可以引用新值,也可以引用舊值。也可以引用舊值。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列行級(jí)觸發(fā)器行級(jí)觸發(fā)器l行級(jí)觸發(fā)器是指在執(zhí)行行級(jí)觸發(fā)器是指在執(zhí)行DML操作時(shí),每作用操作時(shí),每作用一行就觸發(fā)一次的觸發(fā)器。一行就觸發(fā)一次的觸發(fā)器。 l行級(jí)觸發(fā)器是觸發(fā)器中最常用的一種,常用于

49、行級(jí)觸發(fā)器是觸發(fā)器中最常用的一種,常用于數(shù)據(jù)審計(jì)和實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯。數(shù)據(jù)審計(jì)和實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯。l創(chuàng)建行級(jí)觸發(fā)器時(shí)必須加上創(chuàng)建行級(jí)觸發(fā)器時(shí)必須加上FOR EACH ROW子句,凡是還子句,凡是還FOR EACH ROW子句的觸發(fā)器子句的觸發(fā)器都是行級(jí)觸發(fā)器。都是行級(jí)觸發(fā)器。l按照觸發(fā)時(shí)機(jī)的不同,行級(jí)觸發(fā)器可分為按照觸發(fā)時(shí)機(jī)的不同,行級(jí)觸發(fā)器可分為BEFORE行級(jí)觸發(fā)器和行級(jí)觸發(fā)器和AFTER行級(jí)觸發(fā)器。行級(jí)觸發(fā)器。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器 lBEFORE行級(jí)觸發(fā)器指在觸發(fā)器創(chuàng)建語句中行級(jí)觸發(fā)器指在觸發(fā)器創(chuàng)建語句中含有含有BEFORE關(guān)鍵字的

50、行級(jí)觸發(fā)器。關(guān)鍵字的行級(jí)觸發(fā)器。l主要功能:實(shí)現(xiàn)約束不能完成的復(fù)雜的業(yè)務(wù)規(guī)主要功能:實(shí)現(xiàn)約束不能完成的復(fù)雜的業(yè)務(wù)規(guī)則和邏輯則和邏輯 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列AFTER行級(jí)觸發(fā)器行級(jí)觸發(fā)器 lAFTER行級(jí)觸發(fā)器指在觸發(fā)器創(chuàng)建語句中含行級(jí)觸發(fā)器指在觸發(fā)器創(chuàng)建語句中含有有AFTER關(guān)鍵字的行級(jí)觸發(fā)器。關(guān)鍵字的行級(jí)觸發(fā)器。l為了審計(jì)為了審計(jì)DML操作造成的數(shù)據(jù)變化,可以考操作造成的數(shù)據(jù)變化,可以考慮使用慮使用AFTER行級(jí)觸發(fā)器。行級(jí)觸發(fā)器。l在使用在使用AFTER行級(jí)觸發(fā)器時(shí),可以引用新值,行級(jí)觸發(fā)器時(shí),可以引用新值,但是不允許重新設(shè)置新值。但是不允許重新設(shè)置新值。 Hands-O

51、n實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器 l語句級(jí)觸發(fā)器在執(zhí)行語句級(jí)觸發(fā)器在執(zhí)行DML語句時(shí)被自動(dòng)觸發(fā),每個(gè)語句時(shí)被自動(dòng)觸發(fā),每個(gè)DML語句觸發(fā)一次,即無論一個(gè)語句觸發(fā)一次,即無論一個(gè) DML語句影響了多語句影響了多少行數(shù)據(jù),語句級(jí)觸發(fā)器都只執(zhí)行一次。少行數(shù)據(jù),語句級(jí)觸發(fā)器都只執(zhí)行一次。l語句級(jí)觸發(fā)器通常用于審計(jì)語句級(jí)觸發(fā)器通常用于審計(jì)DML操作和強(qiáng)制實(shí)施額操作和強(qiáng)制實(shí)施額外的安全措施。外的安全措施。l創(chuàng)建語句級(jí)觸發(fā)器時(shí)不能包含創(chuàng)建語句級(jí)觸發(fā)器時(shí)不能包含WHEN子句。子句。l按照觸發(fā)時(shí)機(jī)的不同,語句級(jí)觸發(fā)器可分為兩種:按照觸發(fā)時(shí)機(jī)的不同,語句級(jí)觸發(fā)器可分為兩種:BEFORE語句級(jí)觸發(fā)

52、器和語句級(jí)觸發(fā)器和AFTER語句級(jí)觸發(fā)器。語句級(jí)觸發(fā)器。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列BEFORE語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器 lBEFORE語句級(jí)觸發(fā)器指在觸發(fā)器創(chuàng)建語句語句級(jí)觸發(fā)器指在觸發(fā)器創(chuàng)建語句中含有中含有BEFORE關(guān)鍵字的語句級(jí)觸發(fā)器。關(guān)鍵字的語句級(jí)觸發(fā)器。 lBEFORE語句級(jí)觸發(fā)器常用于提供額外的安語句級(jí)觸發(fā)器常用于提供額外的安全性措施。全性措施。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列AFTER語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器 lAFTER語句級(jí)觸發(fā)器指在觸發(fā)器創(chuàng)語句級(jí)觸發(fā)器指在觸發(fā)器創(chuàng)建語句中含有建語句中含有AFTER關(guān)鍵字的語句關(guān)鍵字的語句級(jí)觸發(fā)器。級(jí)觸發(fā)器。lAFTE

53、R語句級(jí)觸發(fā)器一般用來對(duì)語句級(jí)觸發(fā)器一般用來對(duì)DML操作進(jìn)行審計(jì)。操作進(jìn)行審計(jì)。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列小結(jié):小結(jié): DML觸發(fā)器的觸發(fā)順序觸發(fā)器的觸發(fā)順序l如果在一個(gè)表上同時(shí)定義了多種如果在一個(gè)表上同時(shí)定義了多種DML觸觸發(fā)器,則當(dāng)執(zhí)行發(fā)器,則當(dāng)執(zhí)行DML操作時(shí),各種操作時(shí),各種DML觸發(fā)器的觸發(fā)順序如下:觸發(fā)器的觸發(fā)順序如下:l1. BEFORE語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器l2. BEFORE行級(jí)觸發(fā)器行級(jí)觸發(fā)器l3. AFTER行級(jí)觸發(fā)器行級(jí)觸發(fā)器l4. AFTER語句級(jí)觸發(fā)器語句級(jí)觸發(fā)器 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列INSTEAD OF觸發(fā)器觸發(fā)器 lINST

54、EAD OF觸發(fā)器是在視圖上而非表上定義觸發(fā)器是在視圖上而非表上定義的觸發(fā)器。的觸發(fā)器。l對(duì)于簡(jiǎn)單的視圖,可以直接在視圖上執(zhí)行對(duì)于簡(jiǎn)單的視圖,可以直接在視圖上執(zhí)行DML語句而更新基表。但對(duì)于復(fù)雜的視圖,語句而更新基表。但對(duì)于復(fù)雜的視圖,執(zhí)行執(zhí)行DML語句則有某些限制(本書專題四中語句則有某些限制(本書專題四中曾有介紹),此時(shí)可通過曾有介紹),此時(shí)可通過INSTEAD OF觸發(fā)器,觸發(fā)器,用觸發(fā)器內(nèi)的語句來代替實(shí)際的用觸發(fā)器內(nèi)的語句來代替實(shí)際的 DML語句,語句,從而允許用戶更新本來不能用從而允許用戶更新本來不能用DML語句直接語句直接更新的視圖。更新的視圖。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教

55、程系列INSTEAD OF觸發(fā)器觸發(fā)器l使用使用INSTEAD OF觸發(fā)器,需注意以下幾點(diǎn):觸發(fā)器,需注意以下幾點(diǎn):lINSTEAD OF觸發(fā)器只能應(yīng)用于視圖,而不能應(yīng)用觸發(fā)器只能應(yīng)用于視圖,而不能應(yīng)用于表。于表。lINSTEAD OF觸發(fā)器只能是行級(jí)的,不能是語句級(jí)觸發(fā)器只能是行級(jí)的,不能是語句級(jí)的,定義的,定義INSTEAD OF觸發(fā)器時(shí)必須加上觸發(fā)器時(shí)必須加上FOR EACH ROW選項(xiàng)。選項(xiàng)。l在在INSTEAD OF觸發(fā)器不能包含觸發(fā)器不能包含WHEN子句。子句。lINSTEAD OF觸發(fā)器的定義中不能包含觸發(fā)器的定義中不能包含BEFORE和和AFTER選項(xiàng)。選項(xiàng)。 Hands-On實(shí)訓(xùn)教程系列實(shí)訓(xùn)教程系列INSTEAD OF觸發(fā)器觸發(fā)器l建立建立INSTEAD OF觸發(fā)器的語法為:觸發(fā)器的語法為:lCREATE OR REPLACE TRIGGER trigger_namelINSTEAD OFlINSERT|DELETE|UPDATE OF column_listlOR INSERT|DELETE|UPDATE OF column_listlON schema.view_namelREFERENCING NEW AS new_alias OLD AS old_aliaslFOR EACH

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論