軟件測試數據數中Oracle觸發(fā)器語(yǔ)法及實(shí)例
oracle是殷墟(Yin Xu)出土的甲骨文(oracle bone inscriptions)的英文翻譯的第一個(gè)單詞,在英語(yǔ)里是“神諭”的意思。Oracle是世界領(lǐng)先的信息管理軟件開(kāi)發(fā)商,因其復雜的關(guān)系數據庫產(chǎn)品而聞名。Oracle數據庫產(chǎn)品為財富排行榜上的前1000家公司所采用,許多大型網(wǎng)站也選用了Oracle系統。
一 Oracle觸發(fā)器語(yǔ)法
觸發(fā)器是特定事件出現的時(shí)候,自動(dòng)執行的代碼塊。類(lèi)似于存儲過(guò)程,觸發(fā)器與存儲過(guò)程的區別在于:存儲過(guò)程是由用戶(hù)或應用程序顯式調用的,而觸發(fā)器是不能被直接調用的。
功能:
1、 允許/限制對表的修改
2、 自動(dòng)生成派生列,比如自增字段
3、 強制數據一致性
4、 提供審計和日志記錄
5、 防止無(wú)效的事務(wù)處理
6、 啟用復雜的業(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ā)器對象的名稱(chēng)。
由于觸發(fā)器是數據庫自動(dòng)執行的,因此該名稱(chēng)只是一個(gè)名稱(chēng),沒(méi)有實(shí)質(zhì)的用途。
觸發(fā)時(shí)間:指明觸發(fā)器何時(shí)執行,該值可。
before—表示在數據庫動(dòng)作之前觸發(fā)器執行;
after—表示在數據庫動(dòng)作之后出發(fā)器執行。
觸發(fā)事件:指明哪些數據庫動(dòng)作會(huì )觸發(fā)此觸發(fā)器:
insert:數據庫插入會(huì )觸發(fā)此觸發(fā)器;
Oracle觸發(fā)器語(yǔ)法(二)Oracle觸發(fā)器詳解
update:數據庫修改會(huì )觸發(fā)此觸發(fā)器;
delete:數據庫刪除會(huì )觸發(fā)此觸發(fā)器。
表 名:數據庫觸發(fā)器所在的表。
for each row:對表的每一行觸發(fā)器執行一次。如果沒(méi)有這一選項,則只對整個(gè)表執行一次。
2、舉例:
下面的觸發(fā)器在更新表auths之前觸發(fā),目的是不允許在周末修改表:
create triggerauth_secure before insert or update or delete //對整表更新前觸發(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
客戶(hù)投訴:
update T_COMPLAINT_MANAGE set SERVE_NAME=:NEW.STAFF_NAME where SERVE_SEED=:OLD.SEED;
客戶(hù)關(guān)懷
update T_CUSTOMER_CARE set EXECUTOR_NAME=:NEW.STAFF_NAME where EXECUTOR_SEED=:OLD.SEED;
客戶(hù)服務(wù)
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ā)器名稱(chēng)
2、 觸發(fā)語(yǔ)句
3、 觸發(fā)器限制
4、 觸發(fā)操作
1.1、觸發(fā)器名稱(chēng)
create trigger biufer_employees_department_id
命名習慣:
biufer(before insert update for each row)
employees表名
department_id列名
1.2、觸發(fā)語(yǔ)句
比如:
表或視圖上的DML語(yǔ)句
DDL語(yǔ)句
Oracle觸發(fā)器語(yǔ)法(四)
數據庫關(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ú)論是否規定了department_id,對employees表進(jìn)行insert的時(shí)候
2、 對employees表的department_id列進(jìn)行update的時(shí)候
1.3、觸發(fā)器限制
when (new_value.department_id<>80 )
限制不是必須的。此例表示如果列department_id不等于80的時(shí)候,觸發(fā)器就會(huì )執行。
其中的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ì )通知用戶(hù),便改變了用戶(hù)的輸入值。Oracle觸發(fā)器語(yǔ)法(四)
數據庫關(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ú)論是否規定了department_id,對employees表進(jìn)行insert的時(shí)候
2、 對employees表的department_id列進(jìn)行update的時(shí)候
1.3、觸發(fā)器限制
when (new_value.department_id<>80 )
限制不是必須的。此例表示如果列department_id不等于80的時(shí)候,觸發(fā)器就會(huì )執行。
其中的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ì )通知用戶(hù),便改變了用戶(hù)的輸入值。
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/