oracle觸發器的簡單使用

2021-07-24 05:08:03 字數 3547 閱讀 5500

資料庫觸發器是乙個與表相關聯的,儲存的pl/sql程式。同樣也是oracle中的物件之一

每當乙個特定的操作語句(insert,update,delete)在指定的表上發出時,oracle自動

執行觸發中定義的語句序列。--注意沒有select

由於觸發器的這些特性,我們可以在做某個操作之前或操作之後是否可以進行某個操作等等。

案例:每當插入新員工後自動列印「成功插入新員工」(觸發器單詞:trigger)

create or replace trigger saynewemp

after insert --after指定在插入之後觸發觸發器,before指定在插入之前觸發觸發器

on emp

declare

begin

dbms_output.put_line('成功插入新員工');

end;

結果:sql> insert into emp(empno,ename,sal,deptno) values(1001,'tom',3000,10);

成功插入新員工

已建立1行

觸發器,主要用於如下4中場景

1.複雜的安全性檢查

2.資料確認

3.實現資料審計功能

4.完成資料的備份和同步

create [or replace] trigger 觸發器名

--表明是觸發器是在操作前還是操作後生效

--觸發器支援的操作,update可以指定某列執行操作時觸發

on 表名 --為某個表名建立的觸發器

[for each row[when(條件)]] --有這條語句相當於行級觸發器,預設為語句級觸發器

plsql塊

oralce觸發器主要有如下兩種:

語句級觸發器:針對的是表

在指定的操作語句操作之前後之後執行一次(只執行一次,比如說),不管這條語句影響了多少行。

行級觸發器:針對的是行

觸發語句作用的每一條記錄都被觸發,在行級觸發器中使用:old和:new偽記錄變數,識別只得狀態

例如:假如我定義了乙個語句級觸發器,插入10號部門的員工(有3條記錄)到表emp10中,觸發器只會觸發一次

insert into emp10 select * from emp where deptno=10;

假如我定義了乙個行級觸發器,插入10號部門的員工(有3條記錄)到表emp10中,觸發器只會觸發三次

insert into emp10 select * from emp where deptno=10;

--禁止在非工作期間插入新員工

/*

1.週末:to_char(sysdate,'day') in ('星期六','星期日')

2.上班前,下班後:to_number(to_char(sysdate,'hh24')) not betwwn 9 and 18

*/ create or replace trigger securityemp

before insert --在插入前進行檢查

on emp

begin

if to_char(sysdate,'day') in ('星期六','星期日') or

to_number(to_char(sysdate,'hh24')) not betwwn 9 and 18 then

--禁止插入員工,丟擲異常,使用如下方式

--不能直接使用raise丟擲異常,應該使用上邊這種方式,第乙個引數的取值 -20000 ~ -29999

--第二個引數:觸發器丟擲異常後提示的內容

end if;

end;

--如果在非工作時間執行insert語句就會觸發,觸發器,禁止在非工作時間插入新員工

漲後的薪水不能低於漲前的薪水

/*

觸發器二:引數的確認

漲後的薪水不能低於漲前的薪水

1. :old 和 :new 代表同一條記錄

2. :old表示操作該行之前的記錄

:new表示操作該行之後的記錄

*/ create or replace trigger checksalary

before update

on emp

for each row --行級觸發器

begin

--if 漲後的薪水 < 漲前的薪水

if :new.sal < :old.sal then

end if;

end;

注意:行級觸發器中使用:old和:new偽記錄變數,識別資料變化前,變化後的狀態

update emp set sal=sal-1 where empno=7389; --這裡會觸發觸發器

給員工漲工資,當漲後的工作大於6000的時候,審計該員工的資訊(儲存到另外一張表中)

/*

觸發器應用場景三.實現資料審計功能====》基於值得審計

給員工漲工資,當漲後的工作大於6000的時候,審計該員工的資訊

*/ --建立表儲存審計資訊

create table audit_info(

infomation varchar2(2000);

); create or replace trigger do_audit_emp_salary

after update

on emp

for each row

begin

--當員工的工資大於6000插入審計資訊

if :new.sal>6000 then

insert into audit_info values(:new.empno||' '||:new.ename||' '||:new.sal);

end if;

end;

給每個員工漲工資2000,如果存在員工工資大於6000就會插入審計表

update emp set sal = sal+2000;

假如a表為主表,b表為備份表,如果a表中的資料發生變化,則同步到b表

/*

利用觸發器實現資料的同步和備份----》同步備份

假如a表為主表,b表為備份表,如果a表中的資料發生變化,則同步到b表

當員工漲完工資後,自動備份新的工資到備份表中

*/ create or replace trigger sync_salary

after update

on emp

for each row

begin

--當主表更新後,自動進行備份

update emp_back set sal = :new.sal where empno= :new.empno;

end;

update emp set sal=sal+10 where empno=7839;

oracle中還有個利用快照備份,是非同步的。 而利用觸發器,是同步的。

快照備份可以見:

另外觸發器的部分可以參見:

Oracle觸發器的使用!

奮鬥的指令碼 2016 12 22 20 24 本來想著今天發個異常處理的文章的,剛到公司,看了下我負責的乙個目錄表,竟然有人把我失效的目錄給放開了,在群裡問沒人認事,當時就想爆粗口啊,一想,咱是文明人,粗口就算了,自己又沒抓到證據是什麼時候修改的,怪就怪自己!巴馬為了抓住以後誰修改的,把日期給儲存...

oracle 觸發器的使用

觸發器的格式 create or replace trigger 觸發器的名字 before after insert update,delete on 作用於哪張表 for each row 如果是語句級觸發器就不用寫,行級觸發器要寫 declare begin end create table ...

Oracle觸發器簡介 建立 使用觸發器

觸發器類似與儲存過程,都是為了實現特殊功能而執行的 塊。觸發器不允許使用者顯示傳遞引數,不能夠返回引數值,不允許使用者呼叫觸發器。觸發器只是在oracle合適的時間自動呼叫,非常類似於面向程式設計中的 觸發器按照觸發事件型別 物件不同分為 語句觸發器,行觸發器,instead of觸發器,系統事件觸...