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。


1、觸發(fā)器的語法:

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í)行一次。


2、舉例:

下面的觸發(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;


/


二  Oracle觸發(fā)器詳解  

開始:


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ā)器的組成部分:

1、 觸發(fā)器名稱


2、 觸發(fā)語句


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ā)語句

比如:


表或視圖上的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的時候


    1.3、觸發(fā)器限制

when (new_value.department_id<>80 )


限制不是必須的。此例表示如果列department_id不等于80的時候,觸發(fā)器就會執(zhí)行。


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


    1.4、觸發(fā)操作

是觸發(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ā)器不會通知用戶,便改變了用戶的輸入值。


2、觸發(fā)器的類型有:

觸發(fā)器類型:


1、 語句觸發(fā)器


2、 行觸發(fā)器


3、 INSTEAD OF 觸發(fā)


4、 系統(tǒng)條件觸發(fā)器


5、 用戶事件觸發(fā)器


2.1、語句級觸發(fā)器.(語句級觸發(fā)器對每個DML語句執(zhí)行一次)

       是在表上或者某些情況下的視圖上執(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;  


2.2、行級觸發(fā)器.(行級觸發(fā)器對DML語句影響的每個行執(zhí)行一次)

實例一:


–觸發(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

贊(0)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。郵箱:3140448839@qq.com。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明出處:三五互聯(lián)知識庫 » ORACLE 觸發(fā)器語法及實例 一

© 2010-2025   三五互聯(lián)知識庫   三五互聯(lián)旗下IDC知識庫,為您提供域名注冊,企業(yè)郵箱,虛擬主機,云服務(wù)器,云計算,網(wǎng)站建設(shè)等領(lǐng)域?qū)I(yè)的知識介紹!

閩ICP備2023011970號

wordpress template system recommended themebetter

請求次數(shù):60 次,加載用時:0.278 秒,內(nèi)存占用:9.16 MB

登錄

找回密碼

注冊

主站蜘蛛池模板: 丰满少妇高潮无套内谢| 97欧美精品系列一区二区| 久久亚洲精品中文字幕波多野结衣| 欧美日韩精品一区二区三区高清视频 | 亚洲国产午夜精品福利| 亚洲日韩性欧美中文字幕| 玩弄漂亮少妇高潮白浆| 欧美黑人又粗又大又爽免费| 国产精品免费观在线| 国产区成人精品视频| 美女裸体视频永久免费| 亚洲综合久久精品国产高清| 龙胜| 亚洲深深色噜噜狠狠网站| 欧美成人午夜在线观看视频| 草裙社区精品视频播放| 亚洲www永久成人网站| 精品一区二区三区蜜桃久| 亚洲熟伦熟女新五十熟妇| 国语自产少妇精品视频蜜桃 | 亚洲精品综合网中文字幕| 国产重口老太和小伙| 无遮无挡爽爽免费视频| 丁香五月亚洲综合在线国内自拍| 国产午夜精品福利免费不| 久久精品国产99国产精品严洲| 国产精品无码无在线观看 | 熟妇人妻无码中文字幕老熟妇| 欧美丰满熟妇xxxx性| 亚洲欧美自偷自拍视频图片| 国产一区二区三区日韩精品| 精品一区二区三区女性色| 不卡高清AV手机在线观看| 无套内谢少妇一二三四| 高潮迭起av乳颜射后入| 国产一区二区三区av在线无码观看 | 少妇办公室好紧好爽再浪一点| jlzz大jlzz大全免费| 免费无码观看的AV在线播放| 国产SM重味一区二区三区| 宅男噜噜噜66在线观看|