一 Oracle觸發(fā)器語(yǔ)法
觸發(fā)器是特定事件出現(xiàn)的時(shí)候,自動(dòng)執(zhí)行的代碼塊。類似于存儲(chǔ)過(guò)程,觸發(fā)器與存儲(chǔ)過(guò)程的區(qū)別在于:存儲(chǔ)過(guò)程是由用戶或應(yīng)用程序顯式調(diào)用的,而觸發(fā)器是不能被直接調(diào)用的。
功能:
1、 允許/限制對(duì)表的修改
2、 自動(dòng)生成派生列,比如自增字段
3、 強(qiáng)制數(shù)據(jù)一致性
4、 提供審計(jì)和日志記錄
5、 防止無(wú)效的事務(wù)處理
6、 啟用復(fù)雜的業(yè)務(wù)邏輯
觸發(fā)器觸發(fā)時(shí)間有兩種:after和before。
1、觸發(fā)器的語(yǔ)法:
CREATE [OR REPLACE] TIGGER觸發(fā)器名 觸發(fā)時(shí)間 觸發(fā)事件
ON表名
[FOR EACH ROW]
BEGIN
pl/sql語(yǔ)句
END
其中:
觸發(fā)器名:觸發(fā)器對(duì)象的名稱。
由于觸發(fā)器是數(shù)據(jù)庫(kù)自動(dòng)執(zhí)行的,因此該名稱只是一個(gè)名稱,沒(méi)有實(shí)質(zhì)的用途。
觸發(fā)時(shí)間:指明觸發(fā)器何時(shí)執(zhí)行,該值可?。?/span>
before---表示在數(shù)據(jù)庫(kù)動(dòng)作之前觸發(fā)器執(zhí)行;
after---表示在數(shù)據(jù)庫(kù)動(dòng)作之后出發(fā)器執(zhí)行。
觸發(fā)事件:指明哪些數(shù)據(jù)庫(kù)動(dòng)作會(huì)觸發(fā)此觸發(fā)器:
insert:數(shù)據(jù)庫(kù)插入會(huì)觸發(fā)此觸發(fā)器;
Oracle觸發(fā)器語(yǔ)法(二)update:數(shù)據(jù)庫(kù)修改會(huì)觸發(fā)此觸發(fā)器;
delete:數(shù)據(jù)庫(kù)刪除會(huì)觸發(fā)此觸發(fā)器。
表 名:數(shù)據(jù)庫(kù)觸發(fā)器所在的表。
for each row:對(duì)表的每一行觸發(fā)器執(zhí)行一次。如果沒(méi)有這一選項(xiàng),則只對(duì)整個(gè)表執(zhí)行一次。
2、舉例:
下面的觸發(fā)器在更新表auths之前觸發(fā),目的是不允許在周末修改表:
create triggerauth_secure before insert or update or delete //對(duì)整表更新前觸發(fā)
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; /
|
開(kāi)始:
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、觸發(fā)器的組成部分:
1、 觸發(fā)器名稱
2、 觸發(fā)語(yǔ)句
3、 觸發(fā)器限制
4、 觸發(fā)操作
1.1、觸發(fā)器名稱
create trigger biufer_employees_department_id |
命名習(xí)慣:
biufer(before insert update for each row) |
employees表名
department_id列名
1.2、觸發(fā)語(yǔ)句
比如:
表或視圖上的DML語(yǔ)句
數(shù)據(jù)庫(kù)關(guān)閉或啟動(dòng),startup shutdown等等
before insert or update
of department_id on employees referencing old as old_value new as new_value for each row
|
說(shuō)明:
1、 無(wú)論是否規(guī)定了department_id,對(duì)employees表進(jìn)行insert的時(shí)候
2、 對(duì)employees表的department_id列進(jìn)行update的時(shí)候
1.3、觸發(fā)器限制
when (new_value.department_id<>80 ) |
限制不是必須的。此例表示如果列department_id不等于80的時(shí)候,觸發(fā)器就會(huì)執(zhí)行。
其中的new_value是代表更新之后的值。
1.4、觸發(fā)操作
是觸發(fā)器的主體
begin
:new_value.commission_pct :=0; end;
|
主體很簡(jiǎn)單,就是將更新后的commission_pct列置為0
觸發(fā):
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, ‘donny@hotmail.com’,60,10000,.25); select commission_pct from employees where employee_id=12345;
|
觸發(fā)器不會(huì)通知用戶,便改變了用戶的輸入值。Oracle觸發(fā)器語(yǔ)法(四)
數(shù)據(jù)庫(kù)關(guān)閉或啟動(dòng),startup shutdown等等
before insert or update
of department_id on employees referencing old as old_value new as new_value for each row
|
說(shuō)明:
1、 無(wú)論是否規(guī)定了department_id,對(duì)employees表進(jìn)行insert的時(shí)候
2、 對(duì)employees表的department_id列進(jìn)行update的時(shí)候
1.3、觸發(fā)器限制
when (new_value.department_id<>80 ) |
限制不是必須的。此例表示如果列department_id不等于80的時(shí)候,觸發(fā)器就會(huì)執(zhí)行。
其中的new_value是代表更新之后的值。
1.4、觸發(fā)操作
是觸發(fā)器的主體
begin
:new_value.commission_pct :=0; end;
|
主體很簡(jiǎn)單,就是將更新后的commission_pct列置為0
觸發(fā):
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, ‘donny@hotmail.com’,60,10000,.25); select commission_pct from employees where employee_id=12345;
|
觸發(fā)器不會(huì)通知用戶,便改變了用戶的輸入值。
聯(lián)系客服