觸發器權限
數據庫創建用戶時想要在本用戶下使用觸發器,需要給用戶觸發器的權限
使用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 表示創建觸發器,隨后是觸發器的名字,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.刪除觸發器
drop trigger trigger_name;