DML觸發(fā)器--=======================何謂觸發(fā)器?簡言之,是一段命名的PL/SQL代碼塊,只不過該代碼塊在特定的條件下被觸發(fā)并且執(zhí)行。對于這樣的代碼我們稱之為觸發(fā)器。觸發(fā)器根據(jù)觸發(fā)類型的不同又分為不同級別的觸發(fā)器,下面將給出觸發(fā)器的分類,定義,以及使用的示例。一、觸發(fā)器的相關(guān)概念1.觸發(fā)器的分類通常根據(jù)觸發(fā)條件以及觸發(fā)級別的不同分為DML觸發(fā)器,INSTEADO" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

PL/SQL --> DML 觸發(fā)器

系統(tǒng) 2035 0

--=======================

-- PL/SQL --> DML 觸發(fā)器

--=======================

???

??? 何謂觸發(fā)器?簡言之,是一段命名的 PL / SQL 代碼塊,只不過該代碼塊在特定的條件下被觸發(fā)并且執(zhí)行。對于這樣的代碼我們稱之為觸發(fā)器

。觸發(fā)器根據(jù)觸發(fā)類型的不同又分為不同級別的觸發(fā)器,下面將給出觸發(fā)器的分類,定義,以及使用的示例。

?

一、觸發(fā)器的相關(guān)概念

??? 1. 觸發(fā)器的分類

??????? 通常根據(jù)觸發(fā)條件以及觸發(fā)級別的不同分為 DML 觸發(fā)器, INSTEAD OF 觸發(fā)器,系統(tǒng)事件觸發(fā)器。

??????? DML 觸發(fā)器

??????????? ORACLE DML 語句進(jìn)行觸發(fā),可以在 DML 操作前或操作后進(jìn)行觸發(fā),并且可以對每個(gè)行或語句操作上進(jìn)行觸發(fā)。

??????? INSTEAD OF 觸發(fā)器

??????????? ORACLE 里,對于簡單視圖,可以直接使用 DML 進(jìn)行操作,而復(fù)雜視圖則不能直接使用 DML ,因此 INSTEAD OF 觸發(fā)器應(yīng)運(yùn)而生。

??????????? INSTEAD OF 觸發(fā)器主要是為解決復(fù)雜視圖不能執(zhí)行 DML 而創(chuàng)建。

??????? 系統(tǒng)事件觸發(fā)器 ?

??????????? ORACLE 數(shù)據(jù)庫系統(tǒng)的事件中進(jìn)行觸發(fā) , ORACLE 系統(tǒng)的啟動(dòng)與關(guān)閉等 . 使用系統(tǒng)觸發(fā)器 , 便于系統(tǒng)跟蹤 , 監(jiān)測數(shù)據(jù)庫變化情況等。

?

??? 2. 觸發(fā)器的組成 ( 一段 PL / SQL 代碼塊,可以由 PL / SQL , Java , C 進(jìn)行開發(fā) , 特定事件發(fā)生將被觸發(fā) )

??????? a . 觸發(fā)事件

??????????? Oracle 啟動(dòng)、關(guān)閉

??????????? Oracle 錯(cuò)誤消息

??????????? 用戶登錄與斷開會(huì)話

??????????? 特定的表、視圖上的 DML 操作

??????????? 基于 schema DDL 操作

??????? b . 觸發(fā)時(shí)間

??????????? 即該 TRIGGER 是在觸發(fā)事件發(fā)生之前( BEFORE )還是之后 (AFTER) 觸發(fā),也就是觸發(fā)事件和該 TRIGGER 的操作順序。 ?

??????? c . 觸發(fā)器本身

??????????? 指實(shí)際的觸發(fā)代碼,當(dāng)觸發(fā)事件發(fā)生后,觸發(fā)器代碼決定將做何種操作。

??????????? 觸發(fā)器代碼大小不能超過 32k ,對于超長的代碼可以將其置于單獨(dú)的存儲過程,然后在觸發(fā)器中使用 call 調(diào)用該過程。

??????????? 觸發(fā)器代碼只能包含 DQL DML ,而不能包含 DDL 以及事務(wù)控制語言 ( COMMIT,ROLLBACK,SAVEPOINT )

??????? d . 觸發(fā)頻率

??????????? 說明觸發(fā)器內(nèi)定義的動(dòng)作被執(zhí)行的次數(shù)。即語句級 ( STATEMENT ) 觸發(fā)器和行級 ( ROW ) 觸發(fā)器。

??????????? 語句級 ( STATEMENT ) 觸發(fā)器:是指當(dāng)某觸發(fā)事件發(fā)生時(shí),該觸發(fā)器只執(zhí)行一次。

??????????? 行級 ( ROW ) 觸發(fā)器:是指當(dāng)某觸發(fā)事件發(fā)生時(shí),對受到該操作影響的每一行數(shù)據(jù),觸發(fā)器都單獨(dú)執(zhí)行一次。

??? 3. 觸發(fā)器的用途

??????? 控制 DDL 語句的行為,如通過更改、創(chuàng)建或重命名對象

??????? 控制 DML 語句的行為,如插入、更新和刪除

??????? 實(shí)施參照完整性、復(fù)雜業(yè)務(wù)規(guī)則和安全性策略

??????? 在修改視圖中的數(shù)據(jù)時(shí)控制和重定向 DML 語句

??????? 通過創(chuàng)建透明日志來審核系統(tǒng)訪問和行為的信息

?

二、創(chuàng)建 DML 觸發(fā)器語法描述

??? 1. 創(chuàng)建觸發(fā)器的語法

??????? CREATE [OR REPLACE] TRIGGER trigger_name

??????? { BEFORE | AFTER | INSTEAD OF} ????

??????? { INSERT | DELETE | UPDATE [OF column [, column …]]} ??????????????? ?? -- 定義觸發(fā)類型,即那一種或多種 DML 以及特定的列

??????? ON {[schema.] table_name | [schema.] view_name} ?????????????????????? -- 特定的觸發(fā)對象,表或視圖

??????? [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]

??????? [FOR EACH ROW ] ?????????????????????????????????????????????????????? -- 定義觸發(fā)器為行級觸發(fā)器

??????? [WHEN condition]

??????? BEGIN

??????????? trigger_body ;

??????? END ;

???

??????? BEFORE | AFTER | INSTEAD OF

??????????? BEFORE 指在執(zhí)行 DML 之前觸發(fā)觸發(fā)器, AFTER 則是指在 DML 執(zhí)行之后觸發(fā)觸發(fā)器

??????????? INSTEAD OF 觸發(fā)器只針對視圖和對象視圖建立,而不能對表、模式和數(shù)據(jù)庫建立 INSTEAD OF 觸發(fā)器

???????????

??????? [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]

??????????? 說明相關(guān)名稱,在行觸發(fā)器的 PL / SQL 塊和 WHEN 子句中可以使用相關(guān)名稱參照當(dāng)前的新 , 舊列值 , 默認(rèn)的相關(guān)名稱分別為 OLD NEW

??????????? 觸發(fā)器的 PL / SQL 塊中應(yīng)用相關(guān)名稱時(shí),必須在它們之前加冒號 (:) ,但在 WHEN 子句中則不能加冒號。

???????????

??????? [FOR EACH ROW ]

??????????? 定義觸發(fā)器為行級觸發(fā)器。

??????????? 行級觸發(fā)器和語句級觸發(fā)器的區(qū)別表現(xiàn)在:一個(gè) DML 語句可能操縱多行,也可能操縱一行,使用行級觸發(fā)器,不論是一行還是多

??????????? 行數(shù)據(jù)被操縱,行觸發(fā)器為該 DML 的每一行觸發(fā)一次觸發(fā)器操作。語句級觸發(fā)器將整個(gè)語句操作作為觸發(fā)事件,不論該語句影響

??????????? 了多少行,僅僅觸發(fā)一次觸發(fā)器。

??????????? 當(dāng)省略 FOR EACH ROW 選項(xiàng)時(shí), BEFORE AFTER 觸發(fā)器為語句觸發(fā)器,而 INSTEAD OF 觸發(fā)器則為行觸發(fā)器。 ???

??????? ???

??????? [WHEN condition]

??????????? 觸發(fā)條件,當(dāng)條件為 TRUE 時(shí),觸發(fā)器代碼才會(huì)被執(zhí)行,對于 DML 觸發(fā)器,僅僅允許在行級觸發(fā)器上指定觸發(fā)條件。

??????????? condition 為一個(gè)邏輯表達(dá)時(shí),其中必須包含相關(guān)名稱,而不能包含查詢語句,也不能調(diào)用 PL / SQL 函數(shù)。

WHEN 子句可通過引用 new old 偽記錄、一個(gè)組件選擇符和一個(gè)列名來訪問偽字段。

??????????? WHEN 子句不能用在 INSTEAD OF 行觸發(fā)器和其它類型的觸發(fā)器中。

???????????

??? 2.DML 觸發(fā)器的觸發(fā)順序

??????? a . 在單行數(shù)據(jù)上的觸發(fā)順序 ( 觸發(fā)代碼僅被執(zhí)行一次 )

??????????? BEFORE 語句級觸發(fā)器

??????????????? BEFORE 行級觸發(fā)器

??????????????? AFTER 行級觸發(fā)器

??????????? AFTER 語句級觸發(fā)器

??????? b . 在多行數(shù)據(jù)上的觸發(fā)順序 ( 語句級觸發(fā)器僅被執(zhí)行一次,行級觸發(fā)器在每個(gè)作業(yè)行上被執(zhí)行一次 )

??????????? BEFORE 語句級觸發(fā)器

??????????????? BEFORE 行級觸發(fā)器

??????????????? AFTER 行級觸發(fā)器

??????????????? BEFORE 行級觸發(fā)器

??????????????? AFTER 行級觸發(fā)器

??????????? AFTER 語句級觸發(fā)器

???????????

???

??? 3. 觸發(fā)器中的條件謂詞

??????? ORACLE 提供三個(gè)參數(shù) INSERTING , UPDATING , DELETING 用于判斷觸發(fā)了哪些操作。

??????? INSERTING :如果觸發(fā)語句是 INSERT 語句,則為 TRUE, 否則為 FALSE

??????? UPDATING :如果觸發(fā)語句是 UPDATE 語句,則為 TRUE, 否則為 FALSE

??????? DELETING :如果觸發(fā)語句是 DELETE 語句,則為 TRUE, 否則為 FALSE

?

??? 4.NEW OLD 限定符的使用

??????? 使用被插入、更新或刪除的記錄中的列值,可以使用 NEW OLD 限定符來表示

??????? : old 修飾符訪問操作完成前列的值

??????? : new 修飾符訪問操作完成后列的值

???????

??????? 限定符 ??? INSERT 操作 ???? UPDATE 操作 ? DELETE 操作

??????? --------- ? -------------- ? ----------- ? ----------

??????? OLD ??????? NULL ??????????? 有效 ???????? 有效

??????? NEW ??????? 有效 ?????????? 有效 ???????? NULL

?

三、創(chuàng)建 DML 觸發(fā)器 ??

??? 1. 創(chuàng)建 BEFORE 語句級觸發(fā)器

??????? sys@ORCL > drop user scott cascade ; ???? -- 刪除 scott 方案

?

??????? sys@ORCL > start $ORACLE_HOME / rdbms / admin / utlsampl . sql ?? -- 重建 scott 方案

?

??????? sys@ORCL > grant dba to scott ; ? -- 授予 Scott DBA 角色

???????????????????

??????? scott@ORCL > create table emp_check ( oper varchar2 ( 30 ), upd_date date ); ??? -- 創(chuàng)建表存放 emp 表的更新記錄操作的跟蹤 ???

?

??????? CREATE OR REPLACE TRIGGER tr_before_update_emp ??? -- 創(chuàng)建 update 觸發(fā)器

??????? ? BEFORE UPDATE ON emp ??

??????? ? -- FOR EACH ROW

??????? BEGIN

??????? ? INSERT INTO emp_check

??????? ? Values

??????????? ( 'Before update, statement level' , sysdate );

??????? END ;

?

??????? scott@ORCL > select * from emp_check ; ? -- 未執(zhí)行 update 前,跟蹤表記錄為空

?

??????? no rows selected

?

??????? scott@ORCL > update emp set sal = sal + 100 where deptno = 20 ; ?? -- 更新了四條記錄

?

??????? 4 rows updated .

?

??????? scott@ORCL > select * from emp_check ; ???? -- 跟蹤表表插入了一條跟蹤記錄

?

??????? OPER ?????????????????????????? UPD_DATE

??????? ------------------------------ ---------

??????? Before update , statement level 24 - DEC - 10

?

??????? scott@ORCL > update emp set sal = sal + 200 where empno = 7369 ; -- 更新了一條記錄,跟蹤表再次插入一條新記錄

?

??????? 1 row updated .

?

??????? scott@ORCL > select * from emp_check ;

?

??????? OPER ?????????????????????????? UPD_DATE

??????? ------------------------------ ---------

??????? Before update , statement level 24 - DEC - 10

??????? Before update , statement level 24 - DEC - 10 ???????

???

??? 2. 創(chuàng)建 BEFORE 行級觸發(fā)器 ???

??????? 使用上面的代碼來創(chuàng)建行級觸發(fā)器,與之不同的是將上面的代碼中 "-- FOR EACH ROW" "--" 刪除,則創(chuàng)建的觸發(fā)器即為行級觸發(fā)器

??????? 代碼省略

??????????? scott@ORCL > update emp set sal = sal + 200 where deptno = 20 ; -- 再次更新 deptno 為的記錄,且記錄總數(shù)為四條

?

??????????? 4 rows updated . ????????????????????

?

??????????? scott@ORCL > select * from emp_check ; ?? -- emp_check 中增加四條,即為 update 的每一行增加一條記錄

?

??????????? OPER ?????????????????????????? UPD_DATE

??????????? ------------------------------ ---------

??????????? Before update , statement level 24 - DEC - 10

??????????? Before update , statement level 24 - DEC - 10

??????????? Before update , statement level 24 - DEC - 10

??????????? Before update , statement level 24 - DEC - 10

??????????? Before update , statement level 24 - DEC - 10

??????????? Before update , statement level 24 - DEC - 10 ???

???????????

??? 3. 創(chuàng)建 AFTER 語句級觸發(fā)器 ??????

??????? CREATE TABLE audit_table_emp ?? -- 創(chuàng)建一張表 audit_table_emp 存放 emp 表上 DML 操作的次數(shù)

??????? (

??????????? name ??????? VARCHAR2 ( 20 ),

??????????? ins ???? INT ,

??????????? upd ???? INT ,

??????????? del ???? INT ,

??????????? starttime ?? DATE ,

??????????? endtime ???? DATE

??????? );

?

??????? CREATE OR REPLACE TRIGGER tr_audit_emp

??????? AFTER INSERT OR UPDATE OR DELETE ON emp

??????? DECLARE

??????????? v_temp INT ;

??????? BEGIN

??????????? SELECT COUNT (*) INTO v_temp FROM audit_table_emp WHERE name = 'EMP' ;

??????????? IF v_temp = 0 THEN

??????????????? INSERT INTO audit_table_emp VALUES ( 'EMP' , 0 , 0 , 0 , SYSDATE , NULL);

??????????? END IF ;

??????????? CASE

??????????????? WHEN INSERTING THEN ? -- 注意此例中條件謂詞的使用 INSERTING UPDATING DELETING

??????????????????? UPDATE audit_table_emp SET ins = ins + 1 , endtime = SYSDATE WHERE name = 'EMP' ;

??????????????? WHEN UPDATING THEN

??????????????????? UPDATE audit_table_emp SET upd = upd + 1 , endtime = SYSDATE WHERE name = 'EMP' ;

??????????????? WHEN DELETING THEN

??????????????????? UPDATE audit_table_emp SET del = del + 1 , endtime = SYSDATE WHERE name = 'EMP' ;

??????????? END CASE ;

??????? END ; ???

?

??????? scott@ORCL > update emp set sal = sal + 200 where empno = 7788 ; ?

?

??????? scott@ORCL > update emp set sal = sal + 200 where ename = 'SMITH' ;

?

??????? scott@ORCL > delete from emp where empno = 7788 ; ?

?

??????? scott@ORCL > select * from audit_table_emp ; ?? -- 兩次更新及一次被記錄到表中

?

??????? NAME ??????????????????????? INS ??????? UPD ??????? DEL STARTTIME ENDTIME

??????? -------------------- ---------- ---------- ---------- --------- ---------

??????? EMP ?????????????????????????? 0 ????????? 2 ????????? 1 24 - DEC - 10 24 - DEC - 10 ??

?

??????? scott@ORCL > update emp set sal = sal + 100 where deptno = 10 ;

?

??????? 3 rows updated . ?? -- 更新了行,當(dāng) audit_table_emp 表中僅僅記錄一次, UPD 的值增加到

?

??????? scott@ORCL > select * from audit_table_emp ;

?

??????? NAME ??????????????????????? INS ??????? UPD ??????? DEL STARTTIME ENDTIME

??????? -------------------- ---------- ---------- ---------- --------- ---------

??????? EMP ?????????????????????????? 0 ????????? 3 ????????? 1 24 - DEC - 10 24 - DEC - 10 ??????

???????

??? 4. 創(chuàng)建 AFTER 行級觸發(fā)器

??????? CREATE TABLE audit_emp_change ??? -- 創(chuàng)建 audit_emp_change 存放 emp sal 列被更新前后的值

??????? (

??????????? name ??????? VARCHAR2 ( 10 ),

??????????? oldsal ????? NUMBER ( 6 , 2 ),

??????????? newsal ????? NUMBER ( 6 , 2 ),

??????????? time ??????? DATE

??????? );

?

??????? CREATE OR REPLACE TRIGGER tr_sal_change ?

??????? AFTER UPDATE OF sal ON emp ? -- 注意 update 觸發(fā)器中使用了 OF 關(guān)鍵字,當(dāng) sal 列發(fā)生變化時(shí), tr_sal_change 被觸發(fā)

??????? FOR EACH ROW ??????????????? -- 使用行級觸發(fā)器

??????? --WHEN old.job='CLERK')

??????? DECLARE

??????????? v_temp INT ;

??????? BEGIN

??????????? SELECT COUNT (*) INTO v_temp FROM audit_emp_change WHERE name = : old . ename ; ? -- 注意 OLD NEW 的使用

??????????? IF v_temp = 0 THEN

??????????????? INSERT INTO audit_emp_change VALUES (: old . ename , : old . sal , : new . sal , SYSDATE );

??????????? ELSE

??????????????? UPDATE audit_emp_change SET oldsal = : old . sal , newsal = : new . sal , time = SYSDATE WHERE name = : old . ename ;

??????????? END IF ;

??????? END ;

?

??????? scott@ORCL > update emp set sal = sal - 100 where empno = 7369 ; ? -- 更新一行

?

??????? scott@ORCL > select * from audit_emp_change ; ??? --audit_emp_change 表中記錄了一行

?

??????? NAME ?????????? OLDSAL ???? NEWSAL TIME

??????? ---------- ---------- ---------- ---------

??????? SMITH ??????????? 1400 ?????? 1300 24 - DEC - 10

?

??????? scott@ORCL > delete from audit_emp_change ; ? -- 刪除之前的記錄

???

??????? scott@ORCL > update emp set sal = sal + 200 where deptno = 10 ; ?? -- 更新了三行

?

??????? 3 rows updated .

?

??????? scott@ORCL > select * from audit_emp_change ; ?? --audit_emp_change 表中記錄了三行

?

??????? NAME ?????????? OLDSAL ???? NEWSAL TIME

??????? ---------- ---------- ---------- ---------

??????? CLARK ??????????? 2550 ?????? 2750 24 - DEC - 10

??????? KING ???????????? 5100 ???? ?? 5300 24 - DEC - 10

??????? MILLER ?????????? 1400 ?????? 1600 24 - DEC - 10 ?

???

??? 5. 限制行級觸發(fā)器

??????? 限制行級觸發(fā)器是通過添加 [WHEN condition] 判斷條件,來對滿足特定 condition 的記錄觸發(fā)觸發(fā)器。

??????? 對于 DML 觸發(fā)器而言,僅僅允許在行級觸發(fā)器上指定觸發(fā)條件。

??????? 在上面第 4 小點(diǎn)創(chuàng)建 AFTER 行級觸發(fā)器的代碼中,這一行 "--WHEN old.job='CLERK')" 去掉 "--" ,觸發(fā)器變?yōu)榫哂邢薅l件的行級

??????? 觸發(fā)器,則對特定的條件,即 job = 'CLERK' 的記錄在更新其 sal 時(shí)才會(huì)被觸發(fā)。演示省略。

???????

??? 6. 創(chuàng)建 DML 觸發(fā)器的注意事項(xiàng)

??????? DML 觸發(fā)器中不能包含對基表的 DQL 查詢操作

??????????? CREATE OR REPLACE TRIGGER tr_emp_sal

??????????? ? BEFORE UPDATE OF sal ON emp -- 注意 update 觸發(fā)器中使用了 OF 關(guān)鍵字,當(dāng) sal 列發(fā)生變化時(shí), tr_emp_sal 被觸發(fā)

??????????? ? FOR EACH ROW -- 使用行級觸發(fā)器

??????????? DECLARE

??????????? ? maxsal NUMBER ( 6 , 2 );

??????????? BEGIN

??????????? ? SELECT MAX ( sal ) INTO maxsal FROM emp ;

??????????? ? IF : new . sal > maxsal THEN

??????????????? RAISE_APPLICATION_ERROR (- 20004 , 'Beyond the highest salary' );

??????????? ? END IF ;

??????????? END ;

?

??????????? scott@ORCL > update emp set sal = 5000 where empno = 7369 ;

??????????? update emp set sal = 5000 where empno = 7369

??????????? *

??????????? ERROR at line 1 :

??????????? ORA - 04091 : table SCOTT . EMP is mutating , trigger / function may not see it

??????????? ORA - 06512 : at "SCOTT.TR_EMP_SAL" , line 4

??????????? ORA - 04088 : error during execution of trigger 'SCOTT.TR_EMP_SAL' ????????

???????

??? 7. 使用 DML 觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)完整性,參照完整性

??????? 對于復(fù)雜的數(shù)據(jù)完整性,參照完整性,可以通過 DML 觸發(fā)器來完成普通約束所不能完成的任務(wù)

??????????? CREATE OR REPLACE TRIGGER tr_del_upd_deptno

??????????? AFTER DELETE OR UPDATE OF deptno ON dept

??????????? FOR EACH ROW

??????????? BEGIN

??????????? ? IF ( UPDATING AND : old . deptno <>: new . deptno ) THEN

??????????????? UPDATE emp SET deptno =: new . deptno WHERE deptno =: old . deptno ;

??????????? ? END IF ;

??????????? ?

??????????? ? IF DELETING THEN

??????????????? DELETE FROM emp WHERE deptno =: old . deptno ;

??????????? ? END IF ;

??????????? END ;

?

??????????? scott@ORCL > update dept set deptno = 50 where deptno = 10 ;

?

??????????? 1 row updated . ?????

?

??????????? scott@ORCL > select * from emp where deptno = 10 ;

?

??????????? no rows selected

?

??????????? scott@ORCL > select * from emp where deptno = 50 ;

?

??????????????? ? EMPNO ENAME ????? JOB ????????????? MGR HIREDATE ???????? SAL ?????? COMM ???? DEPTNO

??????????? ---------- ---------- --------- ---------- --------- ---------- ---------- ----------

??????????????? ? 7782 CLARK ????? MANAGER ???????? 7839 09 - JUN - 81 ?????? 2750 ??????????????????? 50

??????????????? ? 7839 KING ?????? PRESIDENT ??????????? 17 - NOV - 81 ?????? 5300 ??????????????????? 50

??????????????? ? 7934 MILLER ???? CLERK ?????????? 7782 23 - JAN - 82 ?????? 1600 ???? ??????????????? 50

??? ?

四、管理觸發(fā)器

??? 1. 查看系統(tǒng)中特定對象上的觸發(fā)器

??????? scott@ORCL > select trigger_name , status from user_triggers

??????? ? 2 ? where table_name = 'EMP' ;

?

??????? TRIGGER_NAME ?????????????????? STATUS

??????? ------------------------------ --------

??????? TR_BEFORE_UPDATE_EMP ?????????? ENABLED

??????? TR_AUDIT_EMP ?????????????????? ENABLED

??????? TR_SEC_EMP ???????????????????? ENABLED

??????? TR_SAL_CHANGE ????????????????? ENABLED

??????? TR_EMP_SAL ???????????????????? ENABLED ?

???

??? 2. 查看觸發(fā)器的源代碼

??????? scott@ORCL > col text format a65

??????? scott@ORCL > select line , text from user_source where name = 'TR_DEL_UPD_DEPTNO' ;

?

??????????? ? LINE TEXT

??????? ---------- -----------------------------------------------------------------

??????????????? ? 1 TRIGGER tr_del_upd_deptno

??????????????? ? 2 AFTER DELETE OR UPDATE OF deptno ON dept

??????????????? ? 3 FOR EACH ROW

??????????????? ? 4 BEGIN

??????? ??????? ? 5 ?? IF ( UPDATING AND : old . deptno <>: new . deptno ) THEN

??????????????? ? 6 ???? UPDATE emp SET deptno =: new . deptno WHERE deptno =: old . deptno ;

??????????????? ? 7 ?? END IF ;

??????????????? ? 8

??????????????? ? 9 ?? IF DELETING THEN

??????????????? 10 ???? DELETE FROM emp WHERE deptno =: old . deptno ;

??????????????? 11 ?? END IF ;

??????????????? 12 END ;

??? 3. 禁用觸發(fā)器

??????? 當(dāng)觸發(fā)器被禁用后,則表上的 DML 操作將不會(huì)觸發(fā)該觸發(fā)器,直到該觸發(fā)器被解除禁用 ( alter trigger trigger_name disable )

??????? scott@ORCL > alter trigger tr_emp_sal disable ;

???????

??? 4. 啟用觸發(fā)器

??????? 被禁用的觸發(fā)器可以被解除禁用 ( alter trigger trigger_name enable )

??????? scott@ORCL > alter trigger tr_emp_sal enable ;

???

??? 5. 禁用、啟用表上的所有觸發(fā)器

??????? scott@ORCL > alter table emp disable all triggers ;

?

??????? scott@ORCL > alter table emp enable all triggers ;

?

??? 6. 重新編譯觸發(fā)器

??????? scott@ORCL > alter trigger tr_emp_sal compile ;

???

??? 7. 刪除觸發(fā)器

??????? scott@ORCL > drop trigger tr_emp_sal ;

?

五、更多參考

有關(guān) SQL 請參考

??????? SQL 基礎(chǔ)--> 子查詢

??????? SQL 基礎(chǔ)--> 多表查詢

SQL 基礎(chǔ)--> 分組與分組函數(shù)

SQL 基礎(chǔ)--> 常用函數(shù)

SQL 基礎(chǔ)--> ROLLUP 與CUBE 運(yùn)算符實(shí)現(xiàn)數(shù)據(jù)匯總

SQL 基礎(chǔ)--> 層次化查詢(START BY ... CONNECT BY PRIOR)

?

??? 有關(guān) PL/SQL 請參考

??????? PL/SQL --> 語言基礎(chǔ)

PL/SQL --> 流程控制

PL/SQL --> 存儲過程

PL/SQL --> 函數(shù)

PL/SQL --> 游標(biāo)

PL/SQL --> 隱式游標(biāo)(SQL%FOUND)

PL/SQL --> 異常處理(Exception)

PL/SQL --> PL/SQL 記錄

PL/SQL --> 包的創(chuàng)建與管理

PL/SQL --> 包重載、初始化

PL/SQL --> DBMS_DDL 包的使用

PL/SQL --> DML 觸發(fā)器

PL/SQL --> INSTEAD OF 觸發(fā)器

???????

PL/SQL --> DML 觸發(fā)器


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 老司机日日摸夜夜摸精品影院 | 色综合久久伊人 | 国产精品2020观看久久 | 欧美视频在线一区 | 爱唯侦察1024入口地址 | 日韩在线一区二区三区 | 亚洲精品久久久久综合中文字幕 | 亚洲精品免费视频 | 亚洲人成免费网站 | 国产波多野结衣中文在线播放 | 久久久穴| 日韩美女一区 | 亚洲免费一级视频 | 免费视频爰爱太爽了 | 在线h片| 国产高清精品一区 | www.欧美| 黄 色 免 费 网站在线观看 | 视色视频在线 | 丝袜亚洲精品中文字幕一区 | 欧美毛片性视频区 | 天天做天天爱夜夜大爽完整 | 操一操干一干 | 国产在线麻豆精品 | 五月天婷婷免费视频观看 | 男人的天堂在线免费视频 | 欧美日韩日本国产 | 97在线免费观看 | 中文精品久久久久国产网站 | 亚洲欧洲日本在线观看 | 国产福利在线观看永久免费 | 亚洲精品一线观看 | 精品久久久久久久久久 | 国产精品日韩在线观看 | 在线观看国产一区 | 一级毛片一级片 | 亚洲欧美日韩国产精品一区 | 亚洲综合日韩欧美一区二区三 | 久久久久久午夜精品 | 久久频 | 久久这里只精品热免费99 |