一、觸發器簡介 • 什麼是觸發器(trigger) • 觸發器在資料庫里以獨立的對象存儲,由資料庫產生某一類事件而啟動運行,即觸發器是當某個事件發生時自動地隱式運行。 • 觸發器的特點 • 由特定事件觸發,外部無法調用。 • 觸發器無參數。 • 一個表上最多可有12個觸發器。 • 觸發器的作用 • ...
一、觸發器簡介
• 什麼是觸發器(trigger)
• 觸發器在資料庫里以獨立的對象存儲,由資料庫產生某一類事件而啟動運行,即觸發器是當某個事件發生時自動地隱式運行。
• 觸發器的特點
• 由特定事件觸發,外部無法調用。
• 觸發器無參數。
• 一個表上最多可有12個觸發器。
• 觸發器的作用
• 常用來完成由資料庫的完整性約束難以完成的複雜業務規則的約束,或用來監視對資料庫的各種操作,實現審計的功能。
二、觸發器分類
1)DML觸發器
• Oracle可以在執行DML語句時運行觸發,同時可以指定在DML操作前或操作後進行觸發,指定對每個行或語句操作上進行觸發。
2)替代觸發器
• 由於在Oracle里,不能直接對由兩個以上的表建立的視圖進行操作,所以給出了替代觸發器。Oracle專門為進行視圖操作的一種處理方法。
3)系統觸發器
• Oracle提供了第三種類型的觸發器叫系統觸發器。它可以在Oracle資料庫系統的事件中進行觸發,如Oracle系統的啟動與關閉等。
三、DML觸發器
3.1、DML觸發器闡述
• 也就是在對錶進行insert/delete/update操作時會執行的觸發器。
3.2、DML觸發器語法
CREATE [OR REPLACE] TRIGGER 觸發器名稱
{BEFORE|AFTER}
{INSERT|DELETE|UPDATE[ OF COLUMN1|COLUMN2……]}
ON {[SCHEMA.]表名|{[SCHEMA.]視圖名}
[FOR EACH ROW]
[WHEN 條件表達式]
BEGIN
[語句塊]
END;
3.3、DML觸發器實例
• 增加一個測試記錄表,將增刪改的記錄插入到此表中。
CREATE TABLE "SYSTEM"."EMP_HIS" ( "EMPNO" VARCHAR2(10 BYTE) NOT NULL ENABLE, "ENAME" VARCHAR2(20 BYTE) NOT NULL ENABLE, "SAL" NUMBER(8, 2), "COMM" NUMBER(8, 2), "REM" VARCHAR2(20 BYTE) ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) TABLESPACE "SYSTEM";
1)增加記錄
create or replace trigger triEmpForInsert after insert on emp for each row begin insert into emp_his (empno,ename,sal,comm,rem) values (:new.empno,:new.ename,:new.sal,:new.comm,'增加後'); end;
2)刪除記錄
create or replace trigger triEmpForDelete before delete on emp for each row begin insert into emp_his (empno,ename,sal,comm,rem) values (:old.empno,:old.ename,:old.sal,:old.comm,'刪除前'); end;
3)修改記錄
create or replace trigger triEmpForUpdate after update on emp for each row begin insert into emp_his (empno,ename,sal,comm,rem) values (:old.empno,:old.ename,:old.sal,:old.comm,'更新前'); insert into emp_his (empno,ename,sal,comm,rem) values (:new.empno,:new.ename,:new.sal,:new.comm,'更新後'); end;