網站首頁 編程語言 正文
觸發器是指被隱含執行的存儲過程
一、創建DML觸發器(before/after)
1、行觸發器:
當一個DML操作影響DB中的多行時,對于其中復合觸發條件的每行均觸發一次(for each row)
例1: 建立一個觸發器, 當職工表 emp 表被刪除一條記錄時,把被刪除記錄寫到職工表刪除日志表中去。
CREATE OR REPLACE TRIGGER tr_del_emp
BEFORE DELETE --指定觸發時機為刪除操作前觸發
ON scott.emp
FOR EACH ROW --說明創建的是行級觸發器
BEGIN
--將修改前數據插入到日志記錄表 del_emp ,以供監督使用。
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:級聯更新:利用行觸發器實現級聯更新。在修改了主表regions中的region_id之后(AFTER),級聯的、自動的更新子表countries表中原來在該地區的國家的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:限定只對部門號為80的記錄進行行觸發器操作。
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的人員的獎金不能降');
END IF;
WHEN DELETING THEN
RAISE_APPLICATION_ERROR(-20003, '不能刪除部門80的人員記錄');
END CASE;
END;
/*
實例:
UPDATE employees SET salary = 8000 WHERE employee_id = 177;
DELETE FROM employees WHERE employee_id in (177,170);
*/
2、語句觸發器:
將整個DML語句作為觸發條件,當它符合約束條件時,激活一次觸發器。
限制對Departments表修改(包括INSERT,DELETE,UPDATE)的時間范圍,即不允許在非工作時間修改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, '不是上班時間,不能修改departments表');
END IF;
END;
二、創建替代(instead of )觸發器
用于對視圖(沒有指定WITH CHECK OPTION選項)的DML觸發。
- 只能被創建在視圖上。
- 不能指定BEFORE 或 AFTER選項。
- FOR EACH ROW子可是可選的,即INSTEAD OF觸發器只能在行級上觸發、或只能是行級觸發器,沒有必要指定。
創建INSTEAD_OF觸發器來為 DELETE 操作執行所需的處理,即刪除EMP表中所有基準行:
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;
三、創建系統事件觸發器(on schema/on database)
1、當建立在模式(SCHEMA)之上時,只有模式所指定用戶的DDL操作和它們所導致的錯誤才激活觸發器, 默認時為當前用戶模式。
例1:創建觸發器,存放有關事件信息。
--創建觸犯發器
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、當建立在數據庫(DATABASE)之上時,該數據庫所有用戶的DDL操作和他們所導致的錯誤,以及數據庫的啟動和關閉均可激活觸發器。
要在數據庫之上建立觸發器時,要求用戶具有ADMINISTER DATABASE TRIGGER權限。
例1:創建登錄觸發器。
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;
四、重新編譯觸發器
ALTER TRIGGER trigger COMPILE
刪除觸發器:當刪除表或視圖時,建立在這些對象上的觸發器也隨之刪除。
DROP TRIGGER trigger_name;
禁用或啟用觸發器
ALTER TRIGGER emp_view_delete DISABLE| ENABLE;
--使表EMP 上的所有TRIGGER 失效:
ALTER TABLE emp DISABLE ALL TRIGGERS;
觸發器和數據字典
相關數據字典:USER_TRIGGERS、ALL_TRIGGERS、DBA_TRIGGERS
Oracle 字符集
原文鏈接:https://www.cnblogs.com/springsnow/p/9394769.html
相關推薦
- 2023-08-01 React 中 {} 的應用
- 2022-07-16 uniCloud云開發獲取小程序用戶openid
- 2022-08-31 C++中關于this指針的入門介紹_C 語言
- 2022-09-22 遞歸和迭代(深度優先,廣度優先)的差異
- 2022-08-01 Oracle停止數據泵導入數據的方法詳解_oracle
- 2022-08-21 jQuery實現簡易商城系統項目實操_jquery
- 2022-11-13 Python中torch.load()加載模型以及其map_location參數詳解_python
- 2022-09-08 python裝飾器property和setter用法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支