【Oracle】觸發器最系統入門學習指導__Oracle

來源:互聯網
上載者:User

前言:通過本次學習您可以學到什麼


目錄:

一、什麼是觸發器。

二、觸發器的應用情境是什麼。

  1、複雜的安全性檢查

  2、資料的確認

  3、實現審計功能

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

三、觸發器的文法是什麼。

四、觸發器的類型有哪些。

  1、語句級的觸發器

  2、行級的觸發器

五、案例介紹


----------------------------------------------------------------------------------------------

一、什麼是觸發器。

每當一個特定的資料動作陳述式(insert、update、delete)在指定的表上發出時,Oracle自動地執行觸發器中定義的語句序列。

注意select語句不在上述的操作範圍內。

第一個觸發器:每當成功插入新員工資訊後,自動列印“成功插入新員工”。

如何建立觸發器

create trigger savenewemp

after insert

on emp

declare

begin

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

end;

/

這個oracle中的觸發器就非常類似於我們熟悉的java中的監聽器。



二、觸發器的應用情境是什麼。

  1、複雜的安全性檢查

當我們需要安全性策略的時候,比如周末禁止操作資料庫等。

  2、資料的確認

比如我們漲工資的時候,如果工資變少了,就可以用觸發器進行確認。

  3、實現審計功能

跟蹤表上所做的資料操作,目前也在oracle中單獨實現,也可以用觸發器實現,這種審計叫做基於值的審計

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



三、觸發器的文法是什麼。


上面我們漏提到了一句文法:[For each row[when(條件)]]

首先我們需要先瞭解觸發器的類型,如果有上面這句[For each row[when(條件)]]的話,那他就是行級觸發器。


四、觸發器的類型有哪些。

語句級觸發器:在指定的動作陳述式操作之前或者之後執行一次,不管這條語句影響了多少行。

針對的是表。

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

針對的是行。


五、觸發器的應用情境 

  1、複雜的安全性檢查

實施複雜的安全性檢查:禁止在非工作時間插入新員工。

/*

1、周末:to_char(sysdate,'day') in ('星期六','星期日')

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

*/

create or replace trigger securityemp

before insert

on emp

declare

begin

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

or to_number(to_char(sysdate,'hh24')) not between 9 and 18

then

-- 禁止insert新員工

raise_application_error(-20001,'禁止在非工作時間插入新員工。');

end;

/

注意,上面的raise_application_error函數中的第一個參數的值範圍是-20000~-29999

上面這個例子就是針對錶的一個操作,所以沒有[For each row[when(條件)]]



  2、資料的確認

漲工資不能越漲越少,每一條記錄都需要檢查,必然這個觸發器是行級觸發器。

/*

漲後的薪水不可以少於漲前的薪水

1、:old \ :new :代表的是同一條記錄。

2、:old :表示操作該行之前,這一行的值。

3、:new :標示操作該行之後,這一行的值。

*/

create or replace trigger checksalary

before update

on emp

for each row 

begin

--漲後的薪水不可以少於漲前的薪水

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

if :new.sal < :old.sal then

raise_application_error(-20002,'漲後的薪水不可以少於漲前的薪水。');

end if;

end;

/


上面這個例子就是針對每一行的一個操作,所以有[For each row[when(條件)]]


  

  3、實現審計功能

建立基於值得觸發器

/*

資料庫的審計---》基於值得審計功能

給員工漲工資,當漲後的工資超過6000元的時候,審計該員工的資訊。

*/

--建立表,用於儲存審計資訊

create table audit_info

(

information varchar2(200)

)


create or replace trigger do_audit_emp_salary

after update

on emp

for each row

declare

begin

--當漲後的薪水大於6000,插入審計資訊

if :new.sal > 6000 then

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

end if;

end;

/



上面這個例子就是針對每一行的一個操作,所以有[For each row[when(條件)]]


  4、完成資料的備份和同步 利用觸發器實現資料的備份和同步:同步備份,沒有延時。

分散式資料庫。



/*

資料的備份和同步

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

這是一個行級觸發器。

*/

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;

/



上述是同步備份,若無網路壓力,則無延遲。

下面還有一種快照備份我們不做詳述。


本章小結,希望對您有所協助:

資料庫的觸發器是一個與表相關聯的、儲存的PL/SQL程式。

四個情境:

1、複雜的安全性檢查

2、資料的確認

3、資料庫的審計

4、資料的備份和同步


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.