PLSQL 觸發器

觸發器權限java

數據庫建立用戶時想要在本用戶下使用觸發器,須要給用戶觸發器的權限sql

使用DBA用戶執行  GRANT CREATE TRIGGER TO user_name;數據庫

若是想在當前用戶下建立其餘用戶的觸發器須要具備CREATE ANY TRIGGER的權限日誌

若是要建立的觸發器做用在數據庫上的好比對start或者shutdown事件觸發,則須要具備ADMINISTER DATABASE TRIGGER系統權限。對象

 

觸發器的建立:blog

1.標準觸發器的建立事件

CREATE TRIGGER tirgger_nameio

BEFORE/AFTER DELETE[UPDATE INSERT SHUTDOWN]編譯

ON object_nametable

trigger_sql_body;

Create trigger 表示建立觸發器,隨後是觸發器的名字,before和after表示觸發的時機,在以後是觸發的事件如delete update等,使用on關鍵字說明觸發器的操做對象,該對象能夠是表或者數據庫DATABASE,最後是觸發器的主體代碼邏輯。

實例:

CREATE TRIGGER delete_trigger--建立名爲delete_trigger的觸發器

BEFORE DELETE ON emp-- 以前操做,操做表emp

FOR EACH ROW --說明觸發器對操做的涉及每一行都激發觸發器行爲

  BEGIN  

    dbms_output.put_line('觸發器執行成功,正在刪除');

  END;

2.建立基於JAVA的觸發器:

建立觸發器的執行部分使用java代碼實現

public class  InsertTrigger

{

public static void insertDate() throws Exception

{

Connection conn = JDBCConnection.defaultConnection();

Statement stm = conn.CreateStatement();

stm.execute(" INSERT INTO table_name VALUES(ID1,ID2,'inserting') ");

stm.close();

return;

}

}

而後建立一個存儲過程去包含java代碼

CREATE OR REPLACE PROCEDURE record_insert_trigger() --過程建立

IS

 LANGUAGE JAVA --語言

 NAME 'InsertTrigger.insertDate()'--調用java類 類名.方法名

最後建立觸發器調用

CREATE OR REPLACE TRIGGER record_insert_trigger_data

BEFORE INSERT ON emp

FOR EACH ROW

  BEGIN

    CALL record_insert_trigger();

  END;

 

觸發器的分類

1.基於DML操做的觸發器

  這類觸發器是在當用戶對一個表進行insert delete update 操做時觸發行爲的。

  在對錶進行觸發行爲的時候使用for each row激發表中涉及的每行數據

 該類觸發器語法:

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER INSERT[DELETE UPDATE ]

ON table_name

FOR EACH ROW[WHEN cond]

BEGIN sql_body END;

--這裏須要說下[WHEN cond] 這個是限制條件,行級條件限制,當達到每種條件是在執行觸發器舉例說明

When(old.name in hello world)當oldname是 hello world是執行觸發條件

2.基於DDL操做的觸發器,語法

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER CREATE[DROP ALTER]--建立,刪除修改

ON database_name [WHEN cond]

Sql_body;

此類觸發器的典型應用,當建立修改刪除數據庫表的時候在以前或者以後記錄該用戶的操做信息,以做爲用戶操做日誌。

 

3.基於數據庫級操做的觸發器

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER START[SHUTDOWM,LOGON,LOGOFF]--數據庫、日誌啓動關閉

ON database_name [WHEN cond]

Sql_body;

 

觸發器中的新值和舊值

建立基於DML的觸發器時,因爲操做對象是表,因此有一個可選項即for each row

以實現對每一行都激發觸發器行爲,Oracle提供2個臨時表來訪問每行中的新值和舊值即  :new 和 :old。下面舉例說明下:

先建立update觸發器

CREATE OR REPLACE TRIGGER update_trigger

AFTER UPDATE ON table_name

FOR EACH ROW

  BEGIN

    dbms_output.put_line('舊值:='||:OLD.CHARS);

    dbms_output.put_line('新值:='||:NEW.CHARS);

  END;

查詢table_name表,查詢結果

 

而後執行update操做

UPDATE table_name SET chars='newvalue';

查看輸出日誌

 

證實觸發器執行成功,在查看table_name表數據已變動。

 

審覈觸發器的建立

顧名思義,就是當用戶操做一個重要的表時,如插入數據和更新數據,但願記錄該用戶的用戶名和更改時間等信息,以備審覈時用。建立審覈觸發器前,咱們須要建立一個表,記錄審覈信息

實例:

--建立審覈表

CREATE TABLE user_modify

(

user_name VARCHAR2(20),

modify_time DATE,

modify_content VARCHAR2(20)

);

--建立觸發器

CREATE OR REPLACE TRIGGER user_change

BEFORE UPDATE OR INSERT ON emp

FOR EACH ROW

  BEGIN

    IF inserting THEN 

      INSERT INTO user_modify

      VALUES(USER,SYSDATE,'updating');

    END IF;

  END;

 

刪除觸發器的建立

該類觸發器的主要做用就是當在進行刪除操做的時候,把刪除的記錄記錄到另外一張備份表中。直接實例

--建立刪除備份表

CREATE TABLE delete_back

(

back_id VARCHAR2(20),

back_id2 VARCHAR2(20),

back_id3 VARCHAR2(20)

);

--建立觸發器

CREATE OR REPLACE TRIGGER delete_back

BEFORE DELETE ON emp

FOR EACH ROW

  BEGIN

    INSERT INTO delete_back VALUES(old.back_id,old.back_id2,old.back_id3);

  END;

當用戶操做emp表進行刪除操做,激發觸發器往delete_back表插入刪除的數據明細

 

觸發器基本管理操做

1.從新編譯觸發器

 alter trigger trigger_name complie;

2.屏蔽觸發器(不刪除使其無效)

 alter trigger trigger_name disable;

3.啓用觸發器(適用於屏蔽了的觸發器)

 alter trigger trigger_name ENABLE;

4.刪除觸發器

 drop trigger trigger_name;

相關文章
相關標籤/搜索