Oracle觸發器 數據庫
1、定義:
在觸發事件發生時隱式自動運行的(PL/SQL)程序塊。觸發器不能接收參數,不能被別的程序、函數等調用。
2、構成:
觸發器名稱
觸發器的觸發事件
觸發器的限制條件
觸發器執行語句
DML觸發器觸發事件:
表插入、表更新、表刪除
觸發器觸發時機:
BEFORE AFTER
觸發器種類:
1.語句級觸發器:
語句級觸發器在每一個數據修改語句執行後只調用一次,而無論這一操做將影響到多少行。
摘自百科: 例:建立一個orderdetails_tablelog表及一個AFTER觸發器,用於記錄是哪些用戶刪除了orderdetails表中的數據及刪除的時間。
CREATE TABLE orderdetails_tablelog
(
WHO VARCHAR2(40),
OPER_DATE DATE
);
CREATE OR REPLACE TRIGGER DELE_ORDERDETAILS
AFTER DELETE ON ORDERDETAILS
BEGIN
INSERT INTO ORDERDETAILS_TABLELOG
(WHO, OPER_DATE)
VALUES
(USER, SYSDATE);
在該觸發器被觸發後,儘管一次刪除多條記錄,但觸發器只執行一次插入操做。函數
2.行級觸發器
行級觸發器是按觸發語句所處理的行激發的,能夠引用受到影響的行值。建立觸發器時採用關鍵字FOR EACH ROW
這種訪問是經過兩個相關的標識符實現的
:old :用於存放未進行修改前的數據
:new :用於存放進行修改後的數據事件
3.級聯觸發器
把一個數據庫觸發器的動做與另外一個觸發器聯繫起來,使之觸發另外一個觸發器。ip
3、語法:
CREATE [OR REPLACE] TRIGGER trigger_name --觸發器名字
{BEFORE | AFTER | INSTEAD OF} triggering_event --觸發事件
[WHEN trigger_condition] --限制條件
[FOR EACH ROW] --行級觸發
trigger_body; --執行語句體it
語法說明:
trigger_name是觸發器的名稱。
triggering_event說明了激發觸發器的事件(也可能包括特殊的表或視圖)。
trigger_body是觸發器的代碼。
若是在WHEN子句中指定trigger_condition的話,則首先對該條件求值。觸發器主體只有在該條件爲真值時才運行。io
DML觸發器是針對某個表進行DML操做時觸發的。
DML = Data manipulation language(數據操縱語言)event
詳細語法格式:
CREATE [ OR REPLACE ] TRIGGER trigger_name
{ BEFORE | AFTER }
{ INSERT | DELETE | UPDATE [OF column[,column…] ] } ON { table_name | view_name}
[ REFERENCING
{ OLD [AS] old_name | NEW [AS] new_name } ]
[ FOR EACH ROW ]
[ WHEN trigger_condition ]
trigger_body;table
4、例子date
create or replace trigger "TRI_SA_UPDATE"
after update on xx_table (BEFORE INSERT ON)
for each row
declare
-- local variables here
begin
IF :NEW.NUM_VALUE <> :OLD.NUM_VALUE THEN
XXX
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, '',TRUE);
end TRI_SA_UPDATE;語法