資料庫觸發器是乙個與表相關聯的,儲存的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觸發器,系統事件觸...