Oracle觸發器


  Oracle觸發器

一.觸發器的概念理解。

  數據庫觸發器是一個與表關聯的存儲下來的可以自動執行的PL/SQL程序。每當一個特定的數據操作語句在指定的表上發出時,Oracle自動的執行觸發器中定義的語句序列。比如,你要實現銀行卡數據的插入,插入姓名,數據庫就自動的為你插入卡的ID和你賬戶的ID,這樣的功能就可以使用觸發器來實現。當然,還有其他的作用。

  一個表可以創建多個觸發器。

  一個觸發器可以實現多個功能。

  在觸發器中可以用IF INSERTING THEN 、IF DELETING THEN 、 IF UPDATING THEN 結構來判斷哪種操縱觸發了觸發器從而來實現對應的觸發器功能。(相當於多個觸發器總合在一起)

  觸發器是一把雙刃劍,添加了觸發器,在項目開發的過程中,如果遇到了工作交接,這時就必須溝通好,所以觸發器的注釋一定要寫好。

  觸發器也可以調用存儲過程和存儲函數。

  什么情況下可能會用到觸發器:

    1.數據確認。

    2.實施復雜的安全性檢查。

    3.做審計,跟蹤表上所做的數據操作等。

    4.數據的備份和同步。

  查詢觸發器: select * from user_triggers;

  查詢觸發器、函數、過程: select * from user_source;  

二.觸發器的分類。

  •   語句級觸發器

     語句級觸發器就是在數據操作前或者操作后執行的一次性的觸發器。不管這個操作影響了多少行。

  •       行級觸發器

     數據操作影響到的每一條記錄都被觸發,使用old和new偽記錄變量,識別值的狀態。

     在行級觸發器中偽變量與觸發語句的適用。

 

觸發語句 :old :new
insert   將要插入的數據
update 更新前該行的值 更新后的值
delete 刪除前該行的值  
      通過    :new.屬性值  來調用。
  •       列級觸發器

     列級觸發器僅限於update操作時才會觸發。

三.通過實例來創建觸發器。

    -----------觸發器的語法---------
    CREATE [OR REPLACE] TRIGGER 觸發器名稱
    {BEFORE|AFTER}                                                                            BEFORE|AFTER:觸發觸發器數據操作之前執行觸發器還是之后執行觸發器。
    {DELETE|INSERT|UPDATE[OF列名]}                 DELETE|INSERT|UPDATE[OF列名]:觸發觸發器數據操作的類型。    
    ON 表名
    [FOR EACH ROW [WHEN(條件)]]                  FOR EACH ROW:行級觸發器的關鍵字。WHEN:給行級觸發器加一個條件,滿足條件才執行,從而實現行級判斷。
    PL/SQL塊                  

    ------------實現一個自動增長的ID列的觸發器-------------


    --創建一個id,name的person表--
    create table person(
    id number primary key,
    name varchar2(20) not null
    );

    ---因為是自動增長的觸發器,所以要先創建一個增長的序列--
    create sequence id_incr
    start with 1001
    increment by 1
    nomaxvalue
    nocycle
    cache 10;

    --------創建好序列之后就可以創建觸發器了------------------


    

    --創建一個插入name時觸發ID自動插入的觸發器--

    create or replace trigger id_tri
    before
    insert on person
    for each row
    declare
    nextid number;
    begin
    select id_incr.nextval into nextid from dual;
    :new.id:=nextid;
    end;

    -----所有准備工作完成就可以插入數據了----
    insert into person(name) values('張三');
    insert into person(name) values('李四');

    select * from person;

    

    -----------實現一個插入數據時判斷姓名是否以j開頭的觸發器-------------
    表還是person表


    create or replace trigger j_name
    before
    insert on person for each row
    begin
    if :new.name like 'j%' then
    raise_application_error(-20000,'不能使用j開頭的姓名');
    end if;
    end;

    insert into person(name) values('j雲霞');執行這條語句時就會拋出應用程序異常,提示不能使用j開頭的姓名。相當於高級的約束。

 

    

    ------------------在觸發器中針對某種類型的觸發實現針對的功能---------
    表還是person表

    create or replace trigger is_what
    before
    insert or update or delete on person
    begin
    if inserting then
    dbms_output.put_line('這是插入數據時觸發的');
    elsif updating then
    dbms_output.put_line('這是更新數據時觸發的');
    else
    dbms_output.put_line('這是刪除數據時觸發的');
    end if;
    end;

    使用下列三條語句體來檢測:
    set serveroutput on;
    insert into person(name) values('徐文帥');

    set serveroutput on;
    update person set name='張三' where name='徐文帥';

    set serveroutput on;
    delete person where name='張三';

    注意:is_what觸發器是語句級觸發器,所以你在增刪改檢測的時候,不論person有幾條語句被牽扯到,它只會put_line一條提示語句。這就是語句級觸發器和行級觸發器的一個區別。

    

    ------------------------給id創建一個列級觸發器--------
    create or replace trigger id_up
    before update of id on person
    begin
    dbms_output.put_line('更新id的觸發器被觸發了');
    end;

    

    set serveroutput on;
    update person set id=0000 where id='1001'; 這條語句執行的時候就會觸發id_up觸發器。   

    set serveroutput on;
    update person set name='aaa' where name='bbb';這條語句執行的時候就不會觸發id_up觸發器。

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM