網站首頁 編程語言 正文
一、觸發(fā)器定義
Oracle觸發(fā)器是使用者對Oracle數據庫的對象做特定的操作時,觸發(fā)的一段PL/SQL程序代碼器。觸發(fā)的事件包括對表的DML操作,用戶的DDL操作以及數據庫事件等。
二、觸發(fā)器分類
觸發(fā)器分為語句級觸發(fā)器和行級觸發(fā)器。
- 語句級觸發(fā)器:在某些語句執(zhí)行前或執(zhí)行后被觸發(fā)。
- 行級觸發(fā)器:在定義了觸發(fā)器的表中的行數據改變時就會被觸發(fā)一次。
按照用戶具體的操作事件的類型,可以分為5種觸發(fā)器。
- 數據操作(DML)觸發(fā)器:此觸發(fā)器是定義在Oracle表上的,當對表執(zhí)行insert、update、delete操作時可以觸發(fā)該觸發(fā)器。如果按照對表中行級數據進行觸發(fā)或語句級觸發(fā),又可以分為行級(row)觸發(fā)器,語句級觸發(fā)器,按照修改數據的前后觸發(fā)觸發(fā)器,又可以分為 after 觸發(fā)器和before觸發(fā)器之分。
- 數據定義操作(DDL)觸發(fā)器:當對數據庫對象進行create、alter、drop操作時,觸發(fā)觸發(fā)器進行一些操作記錄保存、或者限定操作。
- 用戶和系統(tǒng)事件觸發(fā)器:該類型的觸發(fā)器是作用在Oracle數據庫系統(tǒng)上,當進行數據庫事件時,觸發(fā)觸發(fā)器,一般用來記錄登錄的相關信息。
- INSTEAD OF 觸發(fā)器:此類型的觸發(fā)器是作用在視圖上,當用戶對視圖進行操作時,觸發(fā)該觸發(fā)器把相關的操作轉換為對表進行操作。
- 復合觸發(fā)器:指的是對數據操作(DML)觸發(fā)器當中的多種類型觸發(fā)器進行復合,比如;一個觸發(fā)器當中包含著after(或before)的行級觸發(fā)器和after(或before)的語句級觸發(fā)器,來完成一些更為復雜的操作。
三、觸發(fā)器功能
Oracle觸發(fā)器可以根據不同的數據庫事件進行特定的調用觸發(fā)器程序塊,因此,它可以幫助開發(fā)者完成一些PL/SQL存儲過程完成不了的問題,比如:
- 允許or限制對表的修改
- 自動生成派生列,比如自增字段(序列)
- 強制數據一致性
- 提供審計和日志記錄
- 防止無效的事務處理
- 啟用復雜的業(yè)務邏輯
但是不推薦在觸發(fā)器當中寫業(yè)務邏輯程序,因為這樣對后期數據的維護將大大提高成本。
四、觸發(fā)器語法
create [or replace] trigger 觸發(fā)器名稱 觸發(fā)時間 觸發(fā)事件 on 表名 [for each row] begin PL/SQL語句塊 end;
語法解釋:
觸發(fā)器名稱:觸發(fā)器對象的名稱,沒有實際用途。
觸發(fā)時間:指定觸發(fā)器何時執(zhí)行,有before和after兩個值。
before:在數據庫動作之前執(zhí)行觸發(fā)器
after:在數據庫動作之后執(zhí)行觸發(fā)器
觸發(fā)事件:指明哪些數據庫動作會觸發(fā)該觸發(fā)器
insert 數據庫插入時會觸發(fā)該觸發(fā)器
update 數據庫更新時會觸發(fā)該觸發(fā)器
delete 數據庫刪除時會觸發(fā)該觸發(fā)器
表名:數據庫觸發(fā)器所在的表
for each row:對觸發(fā)器的執(zhí)行范圍做限定,對表的每一行觸發(fā)器執(zhí)行一次,如果沒有這個選項就是對整個表執(zhí)行一次
五、觸發(fā)器使用案例
案例1:向job1表中插入一條數據后輸出 歡迎加入 語句
--準備工作:拷貝jobs表為job11表,案例1和案例2均在job1表中執(zhí)行。 CREATE TABLE JOB1 AS SELECT * FROM HR.JOBS; --創(chuàng)建觸發(fā)器 create or replace trigger trigger1 after insert on job1 begin dbms_output.put_line('祝您早日漲薪!'); end;
觸發(fā)器創(chuàng)建完成后,可向job1表插入一行數據驗證效果。
--插入數據,觸發(fā)觸發(fā)器的執(zhí)行 insert into job1 values('ruirui','Prisident',15000,30000);
效果如下:
案例2:數據校驗,不允許星期二和星期四向emp1表中插入/更新數據。
create or replace trigger trigger2 before insert or update on job1 declare v_day varchar2(20); begin ---判斷今天是否是星期二或星期四 select to_char(sysdate,'day') into v_day from dual; ---判斷 if v_day = '星期二' then dbms_output.put_line('今天是星期二,不能插入/更新數據!'); raise_application_error(-20001,'今天是星期二,不能插入/更新數據!'); if v_day = '星期四' then dbms_output.put_line('今天是星期四,不能插入/更新數據!'); raise_application_error(-20001,'今天是星期四,不能插入/更新數據!'); end if; end if; end;
觸發(fā)器創(chuàng)建完成后,可向job1表插入一行數據驗證效果。
--插入數據,觸發(fā)觸發(fā)器的執(zhí)行 insert into job1 values('rui1','Prisident',15000,30000);
效果如下:
案例3:創(chuàng)建觸發(fā)器,記錄表的刪除數據
--創(chuàng)建job1_log表用于記錄job1表的刪除記錄 create table job1_log as select * from job1 where 1<>1; --創(chuàng)建觸發(fā)器 create or replace trigger trigger3 after delete on job1 for each row begin insert into job1_log values(:old.job_id,:old.job_title,:old.min_salary,:old.max_salary); dbms_output.put_line('記錄已經成功刪除并記錄到日志'); end;
觸發(fā)器創(chuàng)建完成后,可刪除job1表一行數據驗證效果。
--測試 delete from job1 where job_id='ruirui';
效果如下:
案例4:創(chuàng)建觸發(fā)器,記錄表的更新數據
--創(chuàng)建日志記錄表 create table test_log( l_user varchar2(15), l_type varchar2(15), l_date varchar2(20) ); --創(chuàng)建觸發(fā)器 create or replace trigger trigger4 after delete or insert or update on job1 declare v_type test_log.l_type%type; begin if deleting then v_type := 'delete'; dbms_output.put_line('記錄已經成功刪除并記錄到日志'); elsif inserting then v_type := 'insert'; dbms_output.put_line('記錄已經成功插入并記錄到日志'); elsif updating then v_type := 'update'; dbms_output.put_line('記錄已經成功更新并記錄到日志'); end if; insert into test_log values(user,v_type,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')); end;
觸發(fā)器創(chuàng)建完成后,可更新job1表中數據驗證效果。
--測試 insert into job1 values('rui1','Prisident',15000,30000);
update job1 set min_salary=20000 where job_id='rui1';
delete from job1 where job_id='rui1';
查詢test_log表中記錄如下:
select * from test_log;
案例5:創(chuàng)建觸發(fā)器,在刪除某條數據之前先在記錄表插入該條數據
--創(chuàng)建job1_log表用于記錄job1表的刪除記錄 create table test1_log as select * from job1 where 1<>1; --創(chuàng)建觸發(fā)器 create or replace trigger trigger5 before delete on job1 for each row --行級觸發(fā)器 begin insert into test1_log values(:old.job_id,:old.job_title,:old.min_salary,:old.max_salary); end;
觸發(fā)器創(chuàng)建完成后,可更新job1表中數據驗證效果。
--測試 delete from job1 where job_id='rui2'; commit;
查詢test1_log表中記錄如下:
select * from test01_log;
參考:Oracle數據庫 觸發(fā)器
原文鏈接:https://blog.csdn.net/Ruishine/article/details/123062646
相關推薦
- 2022-02-09 C++解決輸出鏈表中倒數k個結點的問題_C 語言
- 2022-08-13 Redis 性能影響 - 內存碎片和緩沖區(qū)
- 2022-10-01 一文詳解C#?Chart控件_C#教程
- 2022-01-15 解決npm install 報錯 npm ERR! code 128 npm ERR! comman
- 2022-02-12 Cognos Sample for Oracle數據源
- 2022-07-23 SQL?Server中T-SQL標識符介紹與無排序生成序號的方法_MsSql
- 2022-06-08 Spring Cloud Openfeign分析
- 2023-03-20 Redis使用Bitmap的方法實現_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支