【轉載】Oracle 觸發器語法及實例

Oracle觸發器語法

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

功能:

1、 允許/限制對錶的修改

2、 自動生成派生列,比如自增字段

3、 強制數據一致性

4、 提供審計和日誌記錄

5、 防止無效的事務處理

6、 啓用複雜的業務邏輯

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

1、觸發器的語法:

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

ON表名

[FOR EACH ROW]

BEGIN

pl/sql語句

END

其中:

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

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

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

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

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

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

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

< src="http://ad.ccw.com.cn/adshow.asp?positionID=35&js=1&innerJs=1">

Oracle觸發器語法 (二)

update:修改會觸發此觸發器;

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

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

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

2、舉例:

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

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

on auths

begin

if(to_char(sysdate,'DY')='SUN'

RAISE_APPLICATION_ERROR(-20600,' 不能在週末修改表auths');

end if;

end

例子:

  CREATE OR REPLACE TRIGGER CRM.T_SUB_USERINFO_AUR_NAME AFTER UPDATE OF STAFF_NAME

ON CRM.T_SUB_USERINFO

REFERENCING OLD AS OLD NEW AS NEW

FOR EACH ROW

declare

begin

if :NEW.STAFF_NAME!=:OLD.STAFF_NAME then

begin

  • 客戶投訴 

  update T_COMPLAINT_MANAGE set SERVE_NAME=:NEW.STAFF_NAME where SERVE_SEED=:OLD.SEED;
  • 客戶關懷

      update T_CUSTOMER_CARE set EXECUTOR_NAME=:NEW.STAFF_NAME

where EXECUTOR_SEED=:OLD.SEED;

  • 客戶服務 

      update T_CUSTOMER_SERVICE set EXECUTOR_NAME=:NEW.STAFF_NAME

where EXECUTOR_SEED=:OLD.SEED;

end;

end if;

end T_sub_userinfo_aur_name;

/

< src="http://ad.ccw.com.cn/adshow.asp?positionID=35&js=1&innerJs=1">

Oracle觸發器語法 (三)

Oracle觸 發器詳解

開始:

      create triggerbiufer_employees_department_id

beforeinsertorupdateofdepartment_idonemployees

referencingoldasold_value newasnew_value

for each row

when (new_value.department_id<>80 )

begin

:new_value.commission_pct :=0;

end;

/

1、觸發器的組成部分:

1、 觸發器名稱

2、 觸發語句

3、 觸發器限制

4、 觸發操作

1.1、觸發器名稱

      create trigger biufer_employees_department_id

命名習慣:

      biufer(before insert update for each row)

employees表名

department_id列名

1.2、觸發語句

比如:

表或視圖上的DML語句

DDL語句

< src="http://ad.ccw.com.cn/adshow.asp?positionID=35&js=1&innerJs=1">

Oracle觸發器語法 (四)

關閉或啓動,startup shutdown等等 

      before insert or update

of department_id

on employees

referencing old as old_value

new as new_value

for each row

說明:

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

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

1.3、觸發器限制

      when (new_value.department_id<>80 )

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

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

1.4、觸發操作

是觸發器的主體 

      begin

:new_value.commission_pct :=0;

end;

主體很簡單,就是將更新後的commission_pct列置爲0

觸發:

      insert into employees(employee_id,last_name,first_name,hire_date,job_id,email,

department_id,salary,commission_pct )

values( 12345,’Chen’,’Donny’, sysdate, 12, ‘[email protected]’,60,10000,.25);

select commission_pct from employees where employee_id=12345;

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

發佈了130 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章