PLSQL觸發器


觸發器權限

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

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

如果想在當前用戶下創建其他用戶的觸發器需要具有CREATE ANY TRIGGER的權限

如果要創建的觸發器作用在數據庫上的比如對start或者shutdown事件觸發,則需要具有ADMINISTER DATABASE TRIGGER系統權限。

 

觸發器的創建:

1.標准觸發器的創建

CREATE TRIGGER tirgger_name

BEFORE/AFTER DELETE[UPDATE INSERT SHUTDOWN]

ON object_name

trigger_sql_body;

Create trigger 表示創建觸發器,隨后是觸發器的名字,beforeafter表示觸發的時機,在之后是觸發的事件如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)oldnamehello 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.刪除觸發器

 drop trigger trigger_name


免責聲明!

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



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