熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle觸發器語法及實例

2022-06-13   來源: Oracle 

  一 Oracle觸發器語法

  觸發器是特定事件出現的時候自動執行的代碼塊類似於存儲過程觸發器與存儲過程的區別在於:存儲過程是由用戶或應用程序顯式調用的而觸發器是不能被直接調用的

  功能

   允許/限制對表的修改

   自動生成派生列比如自增字段

   強制數據一致性

   提供審計和日志記錄

   防止無效的事務處理

   啟用復雜的業務邏輯

  觸發器觸發時間有兩種after和before

  觸發器的語法

  CREATE [OR REPLACE] TIGGER觸發器名 觸發時間 觸發事件

  ON表名

  [FOR EACH ROW]

  BEGIN

  pl/sql語句

  END

  其中

  觸發器名觸發器對象的名稱

  由於觸發器是數據庫自動執行的因此該名稱只是一個名稱沒有實質的用途

  觸發時間指明觸發器何時執行該值可取

  before—表示在數據庫動作之前觸發器執行;

  after—表示在數據庫動作之後出發器執行

  觸發事件指明哪些數據庫動作會觸發此觸發器

  insert數據庫插入會觸發此觸發器;

  Oracle觸發器語法(二)Oracle觸發器詳解

  update數據庫修改會觸發此觸發器;

  delete數據庫刪除會觸發此觸發器

  表 名數據庫觸發器所在的表

  for each row對表的每一行觸發器執行一次如果沒有這一選項則只對整個表執行一次

  舉例

  下面的觸發器在更新表auths之前觸發目的是不允許在周末修改表

  create triggerauth_secure before insert or update or delete //對整表更新前觸發

  on auths

  begin

  if(to_char(sysdateDY)=SUN

  RAISE_APPLICATION_ERROR(不能在周末修改表auths);

  end if;

  end

  例子

  CREATE OR REPLACE TRIGGER CRMT_SUB_USERINFO_AUR_NAME AFTER UPDATE OF STAFF_NAME

  ON CRMT_SUB_USERINFO

  REFERENCING OLD AS OLD NEW AS NEW

  FOR EACH ROW

  declare

  begin

  if :NEWSTAFF_NAME!=:OLDSTAFF_NAME then

  begin

  客戶投訴

  update T_COMPLAINT_MANAGE set SERVE_NAME=:NEWSTAFF_NAME where SERVE_SEED=:OLDSEED;

  客戶關懷

  update T_CUSTOMER_CARE set EXECUTOR_NAME=:NEWSTAFF_NAME where EXECUTOR_SEED=:OLDSEED;

  客戶服務

  update T_CUSTOMER_SERVICE set EXECUTOR_NAME=:NEWSTAFF_NAME

  where EXECUTOR_SEED=:OLDSEED;

  end;

  end if;

  end T_sub_userinfo_aur_name;

  /

  二

  開始

  create triggerbiufer_employees_department_id

  beforeinsertorupdateofdepartment_idonemployees

  referencingoldasold_value newasnew_value

  for each row

  when (new_valuedepartment_id<> )

  begin

  :mission_pct :=;

  end;

  /

  觸發器的組成部分

   觸發器名稱

   觸發語句

   觸發器限制

   觸發操作

  觸發器名稱

  create trigger biufer_employees_department_id

  命名習慣

  biufer(before insert update for each row)

  employees表名

  department_id列名

  觸發語句

  比如

  表或視圖上的DML語句

  DDL語句

  Oracle觸發器語法(四)

  數據庫關閉或啟動startup shutdown等等

  before insert or update

  of department_id

  on employees

  referencing old as old_value

  new as new_value

  for each row

  說明

   無論是否規定了department_id對employees表進行insert的時候

   對employees表的department_id列進行update的時候

  觸發器限制

  when (new_valuedepartment_id<> )

  限制不是必須的此例表示如果列department_id不等於的時候觸發器就會執行

  其中的new_value是代表更新之後的值

  觸發操作

  是觸發器的主體

  begin

  :mission_pct :=;

  end;

  主體很簡單就是將更新後的commission_pct列置為

  觸發

  insert into employees(employee_idlast_namefirst_namehire_datejob_idemail

  department_idsalarycommission_pct )

  values( ChenDonny sysdate );

  select commission_pct from employees where employee_id=;

  觸發器不會通知用戶便改變了用戶的輸入值Oracle觸發器語法(四)

  數據庫關閉或啟動startup shutdown等等

  before insert or update

  of department_id

  on employees

  referencing old as old_value

  new as new_value

  for each row

  說明

   無論是否規定了department_id對employees表進行insert的時候

   對employees表的department_id列進行update的時候

  觸發器限制

  when (new_valuedepartment_id<> )

  限制不是必須的此例表示如果列department_id不等於的時候觸發器就會執行

  其中的new_value是代表更新之後的值

  觸發操作

  是觸發器的主體

  begin

  :mission_pct :=;

  end;

  主體很簡單就是將更新後的commission_pct列置為

  觸發

  insert into employees(employee_idlast_namefirst_namehire_datejob_idemail

  department_idsalarycommission_pct )

  values( ChenDonny sysdate );

  select commission_pct from employees where employee_id=;

  觸發器不會通知用戶便改變了用戶的輸入值


From:http://tw.wingwit.com/Article/program/Oracle/201311/17146.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.