Oracle中的觸發(fā)器trigger
觸發(fā)器是指被隱含執(zhí)行的存儲(chǔ)過(guò)程
一、創(chuàng)建DML觸發(fā)器(before/after)
1、行觸發(fā)器:
當(dāng)一個(gè)DML操作影響DB中的多行時(shí),對(duì)于其中復(fù)合觸發(fā)條件的每行均觸發(fā)一次(for each row)
例1: 建立一個(gè)觸發(fā)器, 當(dāng)職工表 emp 表被刪除一條記錄時(shí),把被刪除記錄寫到職工表刪除日志表中去。
CREATE OR REPLACE TRIGGER tr_del_emp
BEFORE DELETE --指定觸發(fā)時(shí)機(jī)為刪除操作前觸發(fā)
ON scott.emp
FOR EACH ROW --說(shuō)明創(chuàng)建的是行級(jí)觸發(fā)器
BEGIN
--將修改前數(shù)據(jù)插入到日志記錄表 del_emp ,以供監(jiān)督使用。
INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;例2:級(jí)聯(lián)更新:利用行觸發(fā)器實(shí)現(xiàn)級(jí)聯(lián)更新。在修改了主表regions中的region_id之后(AFTER),級(jí)聯(lián)的、自動(dòng)的更新子表countries表中原來(lái)在該地區(qū)的國(guó)家的region_id
CREATE OR REPLACE TRIGGER tr_reg_cou
AFTER update OF region_id
ON regions
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('舊的region_id值是'||:old.region_id
||'、新的region_id值是'||:new.region_id);
UPDATE countries SET region_id = :new.region_id
WHERE region_id = :old.region_id;
END;例3:限定只對(duì)部門號(hào)為80的記錄進(jìn)行行觸發(fā)器操作。
CREATE OR REPLACE TRIGGER tr_emp_sal_comm
BEFORE UPDATE OF salary, commission_pct
OR DELETE
ON HR.employees
FOR EACH ROW
WHEN (old.department_id = 80)
BEGIN
CASE
WHEN UPDATING ('salary') THEN
IF :NEW.salary < :old.salary THEN
RAISE_APPLICATION_ERROR(-20001, '部門80的人員的工資不能降');
END IF;
WHEN UPDATING ('commission_pct') THEN
IF :NEW.commission_pct < :old.commission_pct THEN
RAISE_APPLICATION_ERROR(-20002, '部門80的人員的獎(jiǎng)金不能降');
END IF;
WHEN DELETING THEN
RAISE_APPLICATION_ERROR(-20003, '不能刪除部門80的人員記錄');
END CASE;
END;
/*
實(shí)例:
UPDATE employees SET salary = 8000 WHERE employee_id = 177;
DELETE FROM employees WHERE employee_id in (177,170);
*/2、語(yǔ)句觸發(fā)器:
將整個(gè)DML語(yǔ)句作為觸發(fā)條件,當(dāng)它符合約束條件時(shí),激活一次觸發(fā)器。
限制對(duì)Departments表修改(包括INSERT,DELETE,UPDATE)的時(shí)間范圍,即不允許在非工作時(shí)間修改departments表。
CREATE OR REPLACE TRIGGER tr_dept_time
BEFORE INSERT OR DELETE OR UPDATE
ON departments
BEGIN
IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日')) OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '18:00') THEN
RAISE_APPLICATION_ERROR(-20001, '不是上班時(shí)間,不能修改departments表');
END IF;
END;二、創(chuàng)建替代(instead of )觸發(fā)器
用于對(duì)視圖(沒(méi)有指定WITH CHECK OPTION選項(xiàng))的DML觸發(fā)。
- 只能被創(chuàng)建在視圖上。
- 不能指定BEFORE 或 AFTER選項(xiàng)。
- FOR EACH ROW子可是可選的,即INSTEAD OF觸發(fā)器只能在行級(jí)上觸發(fā)、或只能是行級(jí)觸發(fā)器,沒(méi)有必要指定。
創(chuàng)建INSTEAD_OF觸發(fā)器來(lái)為 DELETE 操作執(zhí)行所需的處理,即刪除EMP表中所有基準(zhǔn)行:
CREATE OR REPLACE TRIGGER emp_view_delete INSTEAD OF DELETE ON emp_view FOR EACH ROW BEGIN DELETE FROM emp WHERE deptno= :old.deptno; END emp_view_delete;
三、創(chuàng)建系統(tǒng)事件觸發(fā)器(on schema/on database)
1、當(dāng)建立在模式(SCHEMA)之上時(shí),只有模式所指定用戶的DDL操作和它們所導(dǎo)致的錯(cuò)誤才激活觸發(fā)器, 默認(rèn)時(shí)為當(dāng)前用戶模式。
例1:創(chuàng)建觸發(fā)器,存放有關(guān)事件信息。
--創(chuàng)建觸犯發(fā)器
CREATE OR REPLACE TRIGGER tr_ddl
AFTER DDL ON SCHEMA
BEGIN
INSERT INTO ddl_event VALUES
(systimestamp,ora_sysevent, ora_login_user,
ora_dict_obj_type, ora_dict_obj_name);
END tr_ddl;2、當(dāng)建立在數(shù)據(jù)庫(kù)(DATABASE)之上時(shí),該數(shù)據(jù)庫(kù)所有用戶的DDL操作和他們所導(dǎo)致的錯(cuò)誤,以及數(shù)據(jù)庫(kù)的啟動(dòng)和關(guān)閉均可激活觸發(fā)器。
要在數(shù)據(jù)庫(kù)之上建立觸發(fā)器時(shí),要求用戶具有ADMINISTER DATABASE TRIGGER權(quán)限。
例1:創(chuàng)建登錄觸發(fā)器。
CREATE OR REPLACE TRIGGER tr_logon AFTER LOGON ON DATABASE BEGIN INSERT INTO log_event (user_name, address, logon_date) VALUES (ora_login_user, ora_client_ip_address, systimestamp); END tr_logon;
四、重新編譯觸發(fā)器
ALTER TRIGGER trigger COMPILE
刪除觸發(fā)器:當(dāng)刪除表或視圖時(shí),建立在這些對(duì)象上的觸發(fā)器也隨之刪除。
DROP TRIGGER trigger_name;
禁用或啟用觸發(fā)器
ALTER TRIGGER emp_view_delete DISABLE| ENABLE; --使表EMP 上的所有TRIGGER 失效: ALTER TABLE emp DISABLE ALL TRIGGERS;
觸發(fā)器和數(shù)據(jù)字典
相關(guān)數(shù)據(jù)字典:USER_TRIGGERS、ALL_TRIGGERS、DBA_TRIGGERS
Oracle 字符集
到此這篇關(guān)于Oracle觸發(fā)器trigger的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)字符集及修改方式詳解
Oracle語(yǔ)言環(huán)境的描述包括三部分:language、territory、characterset(語(yǔ)言、地域、字符集),這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)字符集概述及修改方式,需要的朋友可以參考下2023-08-08
自動(dòng)備份Oracle數(shù)據(jù)庫(kù)
自動(dòng)備份Oracle數(shù)據(jù)庫(kù)...2007-03-03
Oracle字符函數(shù)應(yīng)用檢測(cè)漢字的方法
這篇文章主要介紹了Oracle字符函數(shù)應(yīng)用檢測(cè)漢字的方法,需要的朋友可以參考下2017-03-03
oracle如何恢復(fù)被覆蓋的存儲(chǔ)過(guò)程
如果你不小心覆蓋了之前的存儲(chǔ)過(guò)程,那得趕緊閃回,時(shí)長(zhǎng)越長(zhǎng)閃回的可能性越小,下面為大家介紹下恢復(fù)原理2014-05-05
Oracle 細(xì)粒度審計(jì)(FGA)初步認(rèn)識(shí)
細(xì)粒度審計(jì)(FGA),是在Oracle 9i中引入的,能夠記錄SCN號(hào)和行級(jí)的更改以重建舊的數(shù)據(jù),本文將詳細(xì)介紹,需要的朋友可以參考下2012-12-12
Oracle 閃回技術(shù)詳細(xì)介紹及總結(jié)
這篇文章主要介紹了Oracle 閃回技術(shù)詳細(xì)介紹的相關(guān)資料,這里提供了4種閃回技術(shù),需要的朋友可以參考下2016-11-11
DBF 文件恢復(fù) ORACLE 數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了DBF 文件 ORACLE 數(shù)據(jù)庫(kù)恢復(fù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01


