天天看點

觸發器Trigger介紹

觸發器簡介

        觸發器是資料庫的一種,編碼方式類似于存儲過程,當有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;