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) 2301 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ā),并且可以對每個行或語句操作上進(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)的啟動與關(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 啟動、關(guān)閉

??????????? Oracle 錯誤消息

??????????? 用戶登錄與斷開會話

??????????? 特定的表、視圖上的 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)定義的動作被執(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)在:一個 DML 語句可能操縱多行,也可能操縱一行,使用行級觸發(fā)器,不論是一行還是多

??????????? 行數(shù)據(jù)被操縱,行觸發(fā)器為該 DML 的每一行觸發(fā)一次觸發(fā)器操作。語句級觸發(fā)器將整個語句操作作為觸發(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ā)器代碼才會被執(zhí)行,對于 DML 觸發(fā)器,僅僅允許在行級觸發(fā)器上指定觸發(fā)條件。

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

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

??????????? 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ā)器在每個作業(yè)行上被執(zhí)行一次 )

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

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

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

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

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

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

???????????

???

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

??????? ORACLE 提供三個參數(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í)才會被觸發(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 操作將不會觸發(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

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 遵义县| 贵南县| 松滋市| 从江县| 酉阳| 临猗县| 长汀县| 徐闻县| 泽普县| 武夷山市| 陆川县| 临泉县| 榆中县| 新乡县| 大理市| 师宗县| 舟曲县| 清水河县| 本溪| 洪泽县| 平谷区| 河西区| 阿图什市| 盖州市| 滦平县| 崇仁县| 都兰县| 乌审旗| 绩溪县| 武清区| 镶黄旗| 昌黎县| 曲松县| 项城市| 曲阜市| 梧州市| 永定县| 芮城县| 崇义县| 资溪县| 义马市|