觸發器簡介
觸發器是資料庫的一種,編碼方式類似于存儲過程,當有DML語句對表進行操作的時候,可以引起觸發器的執行,進而實作對表的資料一緻性維護;
通過觸發器(Trigger)可以實作對某些表的監控,當監控表資料有新增、删除、修改的操作的時候,可以實作使用者自定義的功能,比如:當基礎表發生變化時,以基礎表為基準的接口表資料的一緻性維護;
觸發器基礎文法
create or replace trigger [觸發器名稱]
<after|before|instead of > <insert | update | delete> of [字段] on [表名]
for each row
declare
[變量聲明 ]
begin
[執行代碼 ]
end;
解說:1.觸發器監控的動作 insert \update \delete ,其中如果監聽多個動作,則使用 or 連接配接;
2.監聽的表 用 [on 表名] 形式,如果監聽一個字段,則 [of 字段 on 表名 ] ;如果所有字段都監聽,則 [ on 表名],可以沒有of 字段;
3.for each row 是行級觸發器的标志;如果是行級觸發器,DML執行每條記錄都會執行觸發器,如果是語句級觸發器則是一條語句執行一次觸發器;
4.<after | before | instead of > 标示觸發器與DML語句的執行前後關系,After 指DML實施後觸發器才會執行,Before是指在DML語句執行實施之前觸發器則先執行,而Instead of一般是用于更新視圖的;
5.觸發器的命名規範:
Trigger_name = tableName_trg_<R|S><A|B|I><I|U|D>
觸發器名限于30個字元。必須縮寫表名,以便附加觸發器屬性資訊。
<R|S>基于行級(row)還是語句級(statement)的觸發器
<A|B|I>after, before或者是instead of觸發器
<I|U|D>觸發事件是insert,update還是delete。
觸發器小執行個體
以下觸發器實作對表userinfo的監聽,如果表資料有 insert、update、delete操作則調用觸發器;但是隻有新增的記錄或者是修改使用者名稱uname字段的時候,才會執行代碼段;将修改或者新增的記錄資訊更新到表userLogInfo中;
create or replace trigger userinfo_trg
after insert or update or delete on userinfo
for each row
declare
v_num varchar(10);
begin
if :old.uname <> :new.uname or :old.ucode is null then
--隻有當使用者名稱修改或者新增時,才會執行觸發器
select count(*) into v_num from userLogInfo us;
if v_num <> 0 then--如果沒有這個記錄,則不删除
delete from userLogInfo us where us.ucode = :new.ucode;
end if;
insert into userLogInfo
(ucode, Newnname, Oldnname, Newphone)
values
(:new.ucode, :new.uname, :old.uname, :new.uphonne);
end if;
end;