Oracle之觸發器

一.觸發器的概念理解。 數據庫

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

  一個表能夠建立多個觸發器。 app

  一個觸發器能夠實現多個功能。 函數

  在觸發器中能夠用IF INSERTING THEN 、IF DELETING THEN 、 IF UPDATING THEN 結構來判斷哪一種操縱觸發了觸發器從而來實現對應的觸發器功能。(至關於多個觸發器總合在一塊兒) server

  觸發器是一把雙刃劍,添加了觸發器,在項目開發的過程當中,若是遇到了工做交接,這時就必須溝通好,因此觸發器的註釋必定要寫好。 開發

  觸發器也能夠調用存儲過程和存儲函數。 rem

  什麼狀況下可能會用到觸發器: 同步

    1.數據確認。 it

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

    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觸發器。

相關文章
相關標籤/搜索