新聞中心
觸發(fā)器是許多關(guān)系數(shù)據(jù)庫系統(tǒng)都提供的一項(xiàng)技術(shù)。在ORACLE系統(tǒng)里,觸發(fā)器類似過程和函數(shù),都有聲明,執(zhí)行和異常處理過程的PL/SQL塊。

1、觸發(fā)器說明
觸發(fā)器是一種在事件發(fā)生時(shí)隱式地自動(dòng)執(zhí)行的PL/SQL塊,不能接受參數(shù),不能被顯式調(diào)用。
2、觸發(fā)器類型
根據(jù)觸發(fā)器所創(chuàng)建的語句及所影響的對(duì)象的不同,將觸發(fā)器分為以下3類
(1)DML觸發(fā)器
對(duì)數(shù)據(jù)表進(jìn)行DML語句操作(如insert、update、delete)時(shí)所觸發(fā)的觸發(fā)器,可以分為:
語句級(jí)觸發(fā)器或行級(jí)觸發(fā)器:行級(jí)觸發(fā)器會(huì)對(duì)數(shù)據(jù)庫表中的受影響的每一行觸發(fā)一次觸發(fā)器代碼,語句級(jí)觸發(fā)器則只觸發(fā)一次,與語句所影響到的行數(shù)無關(guān)
before觸發(fā)器或after觸發(fā)器:before觸發(fā)器在觸發(fā)事件發(fā)生之前執(zhí)行觸發(fā)器代碼,after觸發(fā)器則在觸發(fā)事件發(fā)生之后執(zhí)行
語法:
create [or replace] trigger trigger_name
{before | after} trigger_event
on table_name
[for each row]
[when trigger_condition]
trigger_body
語法解釋:
trigger_name:觸發(fā)器名稱
before | after : 指定觸發(fā)器是在觸發(fā)事件發(fā)生之前觸發(fā)還暗示發(fā)生之后觸發(fā)
trigger_event:觸發(fā)事件,在DML觸發(fā)器中主要為insert、update、delete等
table_name:表名,表示發(fā)生觸發(fā)器作用的對(duì)象
for each row:指定創(chuàng)建的是行級(jí)觸發(fā)器,若沒有該子句則創(chuàng)建的是語句級(jí)觸發(fā)器
when trigger_condition:添加的觸發(fā)條件
trigger_body:觸發(fā)體,是標(biāo)準(zhǔn)的PL/SQL語句塊
(2)替代觸發(fā)器(instead of觸發(fā)器)
對(duì)視圖進(jìn)行操作時(shí)定義的觸發(fā)器,替代觸發(fā)器只能定義在視圖上
語法:
create [or replace] trigger trigger_name --觸發(fā)器名稱
instead of trigger_event --觸發(fā)事件
on view_name --視圖名稱
for each row --替代觸發(fā)器必須指定為行級(jí)的觸發(fā)器
[when trigger_condition] --觸發(fā)條件
trigger_body --觸發(fā)體,PL/SQL塊
(3)系統(tǒng)事件觸發(fā)器
對(duì)數(shù)據(jù)庫實(shí)例或某個(gè)用戶模式進(jìn)行操作時(shí)定義的觸發(fā)器,可以分為:
數(shù)據(jù)庫系統(tǒng)觸發(fā)器和用戶觸發(fā)器。
3、案例
(1)DML觸發(fā)器
DML觸發(fā)器的案例都是基于student表和stu_log表來進(jìn)行的,所以先創(chuàng)建student表和stu_log表
create table STUDENT ---創(chuàng)建student表
(
id NUMBER(19), --id
stu_no VARCHAR2(20), --學(xué)號(hào)
stu_name VARCHAR2(32), --姓名
stu_age NUMBER, --年齡
stu_major VARCHAR2(32) --專業(yè)
)
create table STU_LOG ---創(chuàng)建stu_log表,用于記錄對(duì)student表的操作日志
(
log_id NUMBER, --日志id
log_action VARCHAR2(100), --操作名稱
log_date DATE, --操作時(shí)間
log_message VARCHAR2(32) --
)
a、行級(jí)觸發(fā)器(before觸發(fā)器)
創(chuàng)建觸發(fā)器:實(shí)現(xiàn)id的隱式自增
create or replace trigger modify_stu
before insert on student
for each row
declare
next_id number;
begin
select seq_test.nextval into next_id from dual;
:new.id :=next_id;
end;
插入一條數(shù)據(jù),但是不插入id
insert into student(stu_no,stu_name,stu_age,stu_major) values('NO1','張三',20,'中文系');
查詢結(jié)果如下,自動(dòng)生成id了:
b、 行級(jí)觸發(fā)器(after觸發(fā)器)
創(chuàng)建觸發(fā)器:將對(duì)student表的操作都記錄到stu_log表中(update of 用于指定一個(gè)或多個(gè)字段,指定字段被更新時(shí)才會(huì)觸發(fā)觸發(fā)器)
create or replace trigger modify_stu
after insert or delete or update of stu_name
on student
for each row
begin
if inserting then
insert into stu_log values(1,'insert',sysdate,:new.stu_name);
elsif deleting then
insert into stu_log values(2,'delete',sysdate,:old.stu_name);
elsif updating then
insert into stu_log values(3,'update_old',sysdate,:old.stu_name);
insert into stu_log values(4,'update_new',sysdate,:new.stu_name);
end if;
end;
insert into student values(1,'NO2','李四',21,'數(shù)學(xué)系'); --插入一條數(shù)據(jù)
delete student where stu_name='張三'; --刪除一條數(shù)據(jù)
update student set stu_age=19 where stu_name='李四'; --修改李四的年齡
update student set stu_name='王二' where stu_name='李四'; --修改李四的名稱
查詢stu_log表的結(jié)果如下,第3條update語句沒有觸發(fā)該觸發(fā)器,因?yàn)橛|發(fā)器指定只有修改stu_name字段才會(huì)觸發(fā)觸發(fā)器:
ORACLE觸發(fā)器(trigger)的使用ORACLE觸發(fā)器(trigger)的使用
c、語句級(jí)觸發(fā)器(before觸發(fā)器):用來控制對(duì)表的修改
create or replace trigger modify_stu
before insert or update or delete on student
begin
if deleting then
raise_application_error(-20001,'該表不允許刪除數(shù)據(jù)');
elsif updating then
raise_application_error(-20002,'該表不允許修改數(shù)據(jù)');
elsif inserting then
raise_application_error(-20003,'該表不允許插入數(shù)據(jù)');
end if;
end;
插入數(shù)據(jù)時(shí)報(bào)錯(cuò)如下,刪除和修改數(shù)據(jù)同樣也報(bào)錯(cuò):
文章標(biāo)題:詳解ORACLE觸發(fā)器(trigger)
路徑分享:http://m.5511xx.com/article/cdpihdc.html


咨詢
建站咨詢
