--=======================
-- 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ǔ)--> 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 --> 隱式游標(biāo)(SQL%FOUND)
???????
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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