日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Oracle?觸發器trigger使用案例_oracle

作者:夜光小兔紙 ? 更新時間: 2022-04-27 編程語言

一、觸發器定義

Oracle觸發器是使用者對Oracle數據庫的對象做特定的操作時,觸發的一段PL/SQL程序代碼器。觸發的事件包括對表的DML操作,用戶的DDL操作以及數據庫事件等。

二、觸發器分類

觸發器分為語句級觸發器和行級觸發器。

  • 語句級觸發器:在某些語句執行前或執行后被觸發。
  • 行級觸發器:在定義了觸發器的表中的行數據改變時就會被觸發一次。

按照用戶具體的操作事件的類型,可以分為5種觸發器。

  • 數據操作(DML)觸發器:此觸發器是定義在Oracle表上的,當對表執行insert、update、delete操作時可以觸發該觸發器。如果按照對表中行級數據進行觸發或語句級觸發,又可以分為行級(row)觸發器,語句級觸發器,按照修改數據的前后觸發觸發器,又可以分為 after 觸發器和before觸發器之分。
  • 數據定義操作(DDL)觸發器:當對數據庫對象進行create、alter、drop操作時,觸發觸發器進行一些操作記錄保存、或者限定操作。
  • 用戶和系統事件觸發器:該類型的觸發器是作用在Oracle數據庫系統上,當進行數據庫事件時,觸發觸發器,一般用來記錄登錄的相關信息。
  • INSTEAD OF 觸發器:此類型的觸發器是作用在視圖上,當用戶對視圖進行操作時,觸發該觸發器把相關的操作轉換為對表進行操作。
  • 復合觸發器:指的是對數據操作(DML)觸發器當中的多種類型觸發器進行復合,比如;一個觸發器當中包含著after(或before)的行級觸發器和after(或before)的語句級觸發器,來完成一些更為復雜的操作。

三、觸發器功能

Oracle觸發器可以根據不同的數據庫事件進行特定的調用觸發器程序塊,因此,它可以幫助開發者完成一些PL/SQL存儲過程完成不了的問題,比如:

  • 允許or限制對表的修改
  • 自動生成派生列,比如自增字段(序列)
  • 強制數據一致性
  • 提供審計和日志記錄
  • 防止無效的事務處理
  • 啟用復雜的業務邏輯

但是不推薦在觸發器當中寫業務邏輯程序,因為這樣對后期數據的維護將大大提高成本。

四、觸發器語法

create [or replace] trigger 觸發器名稱 觸發時間 觸發事件
on 表名
[for each row]
begin
  PL/SQL語句塊
end;

語法解釋:
觸發器名稱:觸發器對象的名稱,沒有實際用途。
觸發時間:指定觸發器何時執行,有before和after兩個值。
before:在數據庫動作之前執行觸發器
after:在數據庫動作之后執行觸發器
觸發事件:指明哪些數據庫動作會觸發該觸發器
insert 數據庫插入時會觸發該觸發器
update 數據庫更新時會觸發該觸發器
delete 數據庫刪除時會觸發該觸發器
表名:數據庫觸發器所在的表
for each row:對觸發器的執行范圍做限定,對表的每一行觸發器執行一次,如果沒有這個選項就是對整個表執行一次

五、觸發器使用案例

案例1:向job1表中插入一條數據后輸出 歡迎加入 語句

--準備工作:拷貝jobs表為job11表,案例1和案例2均在job1表中執行。
CREATE TABLE JOB1 AS SELECT * FROM HR.JOBS;
--創建觸發器
create or replace trigger trigger1 after insert
on job1
begin
  dbms_output.put_line('祝您早日漲薪!');
end;

觸發器創建完成后,可向job1表插入一行數據驗證效果。

--插入數據,觸發觸發器的執行
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;

觸發器創建完成后,可向job1表插入一行數據驗證效果。

--插入數據,觸發觸發器的執行
insert into job1 values('rui1','Prisident',15000,30000);

效果如下:

在這里插入圖片描述

在這里插入圖片描述

案例3:創建觸發器,記錄表的刪除數據

--創建job1_log表用于記錄job1表的刪除記錄
create table job1_log  as select * from job1 where  1<>1;

--創建觸發器
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;

觸發器創建完成后,可刪除job1表一行數據驗證效果。

--測試
delete from job1 where job_id='ruirui';

效果如下:

在這里插入圖片描述

在這里插入圖片描述

案例4:創建觸發器,記錄表的更新數據

--創建日志記錄表
create table test_log(
  l_user varchar2(15),
  l_type varchar2(15),
  l_date varchar2(20)
);

--創建觸發器
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;

觸發器創建完成后,可更新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:創建觸發器,在刪除某條數據之前先在記錄表插入該條數據

--創建job1_log表用于記錄job1表的刪除記錄
create table test1_log  as select * from job1 where  1<>1;

--創建觸發器
create or replace trigger trigger5 before delete on job1
for each row --行級觸發器
begin
  insert into test1_log values(:old.job_id,:old.job_title,:old.min_salary,:old.max_salary);
end;

觸發器創建完成后,可更新job1表中數據驗證效果。

--測試
delete from job1 where job_id='rui2';
commit;

查詢test1_log表中記錄如下:

select * from test01_log;

在這里插入圖片描述

參考:Oracle數據庫 觸發器

原文鏈接:https://blog.csdn.net/Ruishine/article/details/123062646

欄目分類
最近更新