http://www.zw1840.com/oracle/translation/concepts/html/22.Triggers.htm
http://www.zw1840.com/oracle/index.htm
觸發(fā)器是特定事件出現(xiàn)的時候,自動執(zhí)行的代碼塊。類似于存儲過程,觸發(fā)器與存儲過程的區(qū)別在于: 存儲過程是由用戶或應(yīng)用程序顯式調(diào)用的,而觸發(fā)器是不能被直接調(diào)用的。
功能:
1、 允許/限制對表的修改
2、 自動生成派生列,比如自增字段
3、 強制數(shù)據(jù)一致性
4、 提供審計和日志記錄
5、 防止無效的事務(wù)處理
6、 啟用復(fù)雜的業(yè)務(wù)邏輯
觸發(fā)器觸發(fā)時間有兩種:after和before。
CREATE [OR REPLACE] TIGGER 觸發(fā)器名 觸發(fā)時間 觸發(fā)事件
ON 表名
[FOR EACH ROW]
BEGIN
pl/sql 語句
END
其中:
觸發(fā)器名:觸發(fā)器對象的名稱。
由于觸發(fā)器是數(shù)據(jù)庫自動執(zhí)行的,因此該名稱只是一個名稱,沒有實質(zhì)的用途。
觸發(fā)時間:指明觸發(fā)器何時執(zhí)行,該值可?。?/P>
before—表示在數(shù)據(jù)庫動作之前觸發(fā)器執(zhí)行;
after—表示在數(shù)據(jù)庫動作之后出發(fā)器執(zhí)行。
觸發(fā)事件:指明哪些數(shù)據(jù)庫動作會觸發(fā)此觸發(fā)器:
insert:數(shù)據(jù)庫插入會觸發(fā)此觸發(fā)器;
update:數(shù)據(jù)庫修改會觸發(fā)此觸發(fā)器;
delete:數(shù)據(jù)庫刪除會觸發(fā)此觸發(fā)器。
表 名:數(shù)據(jù)庫觸發(fā)器所在的表。
for each row:對表的每一行觸發(fā)器執(zhí)行一次。如果沒有這一選項,則只對整個表執(zhí)行一次。
下面的觸發(fā)器在更新表auths之前觸發(fā),目的是不允許在周末修改表:
create trigger auth_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
–客戶投訴
update T_COMPLAINT_MANAGE set SERVE_NAME=:NEW.STAFF_NAME where SERVE_SEED=:OLD.SEED;
–客戶關(guān)懷
update T_CUSTOMER_CARE set EXECUTOR_NAME=:NEW.STAFF_NAME
where EXECUTOR_SEED=:OLD.SEED;
–客戶服務(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;
/
開始:
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_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
/
1、 觸發(fā)器名稱
2、 觸發(fā)語句
3、 觸發(fā)器限制
4、 觸發(fā)操作
create trigger biufer_employees_department_id
命名習(xí)慣:
biufer(before insert update for each row)
employees 表名
department_id 列名
比如:
表或視圖上的DML語句
DDL語句
數(shù)據(jù)庫關(guān)閉或啟動,startup shutdown 等等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
說明:
1、 無論是否規(guī)定了department_id ,對employees表進行insert的時候
2、 對employees表的department_id列進行update的時候
when (new_value.department_id<>80 )
限制不是必須的。此例表示如果列department_id不等于80的時候,觸發(fā)器就會執(zhí)行。
其中的new_value是代表更新之后的值。
是觸發(fā)器的主體
begin
:new_value.commission_pct :=0;
end;
主體很簡單,就是將更新后的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ā)器不會通知用戶,便改變了用戶的輸入值。
觸發(fā)器類型:
1、 語句觸發(fā)器
2、 行觸發(fā)器
3、 INSTEAD OF 觸發(fā)
4、 系統(tǒng)條件觸發(fā)器
5、 用戶事件觸發(fā)器
是在表上或者某些情況下的視圖上執(zhí)行的特定語句或者語句組上的觸發(fā)器。能夠與INSERT、UPDATE、DELETE或者組合上進行關(guān)聯(lián)。但是無論使用什么樣的組合,各個語句觸發(fā)器都只會針對指定語句激活一次。比如,無論update多少行,也只會調(diào)用一次update語句觸發(fā)器。
實例:
create or replace trigger tri_test
after insert or update or delete on test
begin
if updating then
dbms_output.put_line(\\\’修改\\\’);
elsif deleting then
dbms_output.put_line(\\\’刪除\\\’);
elsif inserting then
dbms_output.put_line(\\\’插入\\\’);
end if;
end;
實例一:
–觸發(fā)器
–行級觸發(fā)器
create table test(sid number,sname varchar2(20));–創(chuàng)建一個表
create sequence seq_test;–創(chuàng)建序列
create or replace trigger tri_test–創(chuàng)建觸發(fā)器
before insert or update of sid on test
for each row–觸發(fā)每一行
begin
if inserting then
select seq_test.nextval into:new.sid from dual;
else
raise_application_error(-20020,\\\’不允許更新ID值!\\\’);–中斷程序
end if;
end;
–測試,插入幾條記錄
insert into test values(0,\\\’ff\\\’);
insert into test values(0,\\\’ff\\\’);
insert into test values(0,\\\’tt\\\’);
輸出結(jié)果如下圖所示:
實例二:
–創(chuàng)建一個觸發(fā)器,無論用戶插入新記錄,還是修改emp表的job列,都將用戶指定的job列的值轉(zhuǎn)換成大寫.
create or replace trigger trig_job
before insert or update of job
on emp
for each row
<SPAN lang=EN-US style=FONT-FAMILY: 宋體; mso-bidi-font-size: 10.5
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機的問題,請訪問三五互聯(lián)官網(wǎng):m.shinetop.cn