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

Oracle觸發器詳細介紹

2013-11-13 16:04:19  來源: Oracle 

  觸發器

  是特定事件出現的時候自動執行的代碼塊類似於存儲過程但是用戶不能直接調用他們

  功能

   允許/限制對表的修改

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

   強制數據一致性

   提供審計和日志記錄

   防止無效的事務處理

   啟用復雜的業務邏輯

  開始

  create trigger biufer_employees_department_id

  before insert or update

  of department_id

  on employees

  referencing old as old_value

  new as new_value

  for each row

  when (new_valuedepartment_id<> )

  :mission_pct :=;

  觸發器的組成部分

   觸發器名稱

   觸發語句

   觸發器限制

   觸發操作

   觸發器名稱

  create trigger biufer_employees_department_id

  命名習慣

  biufer(before insert update for each row)

  employees 表名

  department_id 列名

   觸發語句

  表或視圖上的DML語句

  數據庫關閉或啟動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是代表更新之後的值

   觸發操作

  是觸發器的主體

  :mission_pct :=;

  end;

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

  insert into employees(employee_id

  last_namefirst_namehire_datejob_idemaildepartment_idsalarycommission_pct )

  values( ChenDonny sysdate );

  select commission_pct from employees where employee_id=;

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

  觸發器類型

   語句觸發器

   行觸發器

   INSTEAD OF 觸發器

   系統條件觸發器

   用戶事件觸發器

   語句觸發器

  是在表上或者某些情況下的視圖上執行的特定語句或者語句組上的觸發器能夠與INSERTUPDATEDELETE或者組合上進行關聯但是無論使用什麼樣的組合各個語句觸發器都只會針對指定語句激活一次比如無論update多少行也只會調用一次update語句觸發器

  例子

  需要對在表上進行DML操作的用戶進行安全檢查看是否具有合適的特權

  Create table foo(a number);

  Create trigger biud_foo

  Before insert or update or delete

  On foo

  If user not in (DONNY) then

  Raise_application_error( You dont have access to modify this table);

  End if;

  即使SYSSYSTEM用戶也不能修改foo表

  [試驗]

  對修改表的時間人物進行日志記錄

   建立試驗表

  create table employees_copy as select *from hremployees

   建立日志表

  create table employees_log(

  who varchar()

  when date);

   在employees_copy表上建立語句觸發器在觸發器中填充employees_log 表

  Create or replace trigger biud_employee_copy

  Before insert or update or delete

  On employees_copy

  Begin

  Insert into employees_log(

  Whowhen)

  Values( user sysdate);

  

  End;

  /

  update employees_copy set salary= salary*;

  select *from employess_log;

   確定是哪個語句起作用?

  即是INSERT/UPDATE/DELETE中的哪一個觸發了觸發器?

  可以在觸發器中使用INSERTING / UPDATING / DELETING 條件謂詞作判斷

  if inserting then

  

  elsif updating then

  

  elsif deleting then

  

  end if;

  if updating(COL) or updating(COL) then

  

  end if;

  [試驗]

   修改日志表

  alter table employees_log

  add (action varchar());

   修改觸發器以便記錄語句類型

  Create or replace trigger biud_employee_copy

  Before insert or update or delete

  On employees_copy

  Declare

  L_action employees_logaction%type;

  Begin

  if inserting then

  l_action:=Insert;

  elsif updating then

  l_action:=Update;

  elsif deleting then

  l_action:=Delete;

  else

  raise_application_error(You should never ever get this error);

  Insert into employees_log(

  Whoactionwhen)

  Values( user l_actionsysdate);

  End;

  /

  insert into employees_copy( employee_id last_name email hire_date job_id)

  values(ChenDonny@hotmailsysdate);

  select *from employees_log
From:http://tw.wingwit.com/Article/program/Oracle/201311/17764.html

  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.