您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Oracle的觸發(fā)器trigger如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Oracle的觸發(fā)器trigger如何使用”吧!
Oracle觸發(fā)器是使用者對(duì)Oracle數(shù)據(jù)庫的對(duì)象做特定的操作時(shí),觸發(fā)的一段PL/SQL程序代碼器。觸發(fā)的事件包括對(duì)表的DML操作,用戶的DDL操作以及數(shù)據(jù)庫事件等。
觸發(fā)器分為語句級(jí)觸發(fā)器和行級(jí)觸發(fā)器。
語句級(jí)觸發(fā)器:在某些語句執(zhí)行前或執(zhí)行后被觸發(fā)。
行級(jí)觸發(fā)器:在定義了觸發(fā)器的表中的行數(shù)據(jù)改變時(shí)就會(huì)被觸發(fā)一次。
按照用戶具體的操作事件的類型,可以分為5種觸發(fā)器。
數(shù)據(jù)操作(DML)觸發(fā)器:此觸發(fā)器是定義在Oracle表上的,當(dāng)對(duì)表執(zhí)行insert、update、delete操作時(shí)可以觸發(fā)該觸發(fā)器。如果按照對(duì)表中行級(jí)數(shù)據(jù)進(jìn)行觸發(fā)或語句級(jí)觸發(fā),又可以分為行級(jí)(row)觸發(fā)器,語句級(jí)觸發(fā)器,按照修改數(shù)據(jù)的前后觸發(fā)觸發(fā)器,又可以分為 after 觸發(fā)器和before觸發(fā)器之分。
數(shù)據(jù)定義操作(DDL)觸發(fā)器:當(dāng)對(duì)數(shù)據(jù)庫對(duì)象進(jìn)行create、alter、drop操作時(shí),觸發(fā)觸發(fā)器進(jìn)行一些操作記錄保存、或者限定操作。
用戶和系統(tǒng)事件觸發(fā)器:該類型的觸發(fā)器是作用在Oracle數(shù)據(jù)庫系統(tǒng)上,當(dāng)進(jìn)行數(shù)據(jù)庫事件時(shí),觸發(fā)觸發(fā)器,一般用來記錄登錄的相關(guān)信息。
INSTEAD OF 觸發(fā)器:此類型的觸發(fā)器是作用在視圖上,當(dāng)用戶對(duì)視圖進(jìn)行操作時(shí),觸發(fā)該觸發(fā)器把相關(guān)的操作轉(zhuǎn)換為對(duì)表進(jìn)行操作。
復(fù)合觸發(fā)器:指的是對(duì)數(shù)據(jù)操作(DML)觸發(fā)器當(dāng)中的多種類型觸發(fā)器進(jìn)行復(fù)合,比如;一個(gè)觸發(fā)器當(dāng)中包含著after(或before)的行級(jí)觸發(fā)器和after(或before)的語句級(jí)觸發(fā)器,來完成一些更為復(fù)雜的操作。
Oracle觸發(fā)器可以根據(jù)不同的數(shù)據(jù)庫事件進(jìn)行特定的調(diào)用觸發(fā)器程序塊,因此,它可以幫助開發(fā)者完成一些PL/SQL存儲(chǔ)過程完成不了的問題,比如:
允許or限制對(duì)表的修改
自動(dòng)生成派生列,比如自增字段(序列)
強(qiáng)制數(shù)據(jù)一致性
提供審計(jì)和日志記錄
防止無效的事務(wù)處理
啟用復(fù)雜的業(yè)務(wù)邏輯
但是不推薦在觸發(fā)器當(dāng)中寫業(yè)務(wù)邏輯程序,因?yàn)檫@樣對(duì)后期數(shù)據(jù)的維護(hù)將大大提高成本。
create [or replace] trigger 觸發(fā)器名稱 觸發(fā)時(shí)間 觸發(fā)事件 on 表名 [for each row] begin PL/SQL語句塊 end;
語法解釋:
觸發(fā)器名稱:觸發(fā)器對(duì)象的名稱,沒有實(shí)際用途。
觸發(fā)時(shí)間:指定觸發(fā)器何時(shí)執(zhí)行,有before和after兩個(gè)值。
before:在數(shù)據(jù)庫動(dòng)作之前執(zhí)行觸發(fā)器
after:在數(shù)據(jù)庫動(dòng)作之后執(zhí)行觸發(fā)器
觸發(fā)事件:指明哪些數(shù)據(jù)庫動(dòng)作會(huì)觸發(fā)該觸發(fā)器
insert 數(shù)據(jù)庫插入時(shí)會(huì)觸發(fā)該觸發(fā)器
update 數(shù)據(jù)庫更新時(shí)會(huì)觸發(fā)該觸發(fā)器
delete 數(shù)據(jù)庫刪除時(shí)會(huì)觸發(fā)該觸發(fā)器
表名:數(shù)據(jù)庫觸發(fā)器所在的表
for each row:對(duì)觸發(fā)器的執(zhí)行范圍做限定,對(duì)表的每一行觸發(fā)器執(zhí)行一次,如果沒有這個(gè)選項(xiàng)就是對(duì)整個(gè)表執(zhí)行一次
--準(zhǔn)備工作:拷貝jobs表為job11表,案例1和案例2均在job1表中執(zhí)行。 CREATE TABLE JOB1 AS SELECT * FROM HR.JOBS; --創(chuàng)建觸發(fā)器 create or replace trigger trigger1 after insert on job1 begin dbms_output.put_line('祝您早日漲薪!'); end;
觸發(fā)器創(chuàng)建完成后,可向job1表插入一行數(shù)據(jù)驗(yàn)證效果。
--插入數(shù)據(jù),觸發(fā)觸發(fā)器的執(zhí)行 insert into job1 values('ruirui','Prisident',15000,30000);
效果如下:
create or replace trigger trigger2 before insert or update on job1 declare v_day varchar2(20); begin ---判斷今天是否是星期二或星期四 select to_char(sysdate,'day') into v_day from dual; ---判斷 if v_day = '星期二' then dbms_output.put_line('今天是星期二,不能插入/更新數(shù)據(jù)!'); raise_application_error(-20001,'今天是星期二,不能插入/更新數(shù)據(jù)!'); if v_day = '星期四' then dbms_output.put_line('今天是星期四,不能插入/更新數(shù)據(jù)!'); raise_application_error(-20001,'今天是星期四,不能插入/更新數(shù)據(jù)!'); end if; end if; end;
觸發(fā)器創(chuàng)建完成后,可向job1表插入一行數(shù)據(jù)驗(yàn)證效果。
--插入數(shù)據(jù),觸發(fā)觸發(fā)器的執(zhí)行 insert into job1 values('rui1','Prisident',15000,30000);
效果如下:
--創(chuàng)建job1_log表用于記錄job1表的刪除記錄 create table job1_log as select * from job1 where 1<>1; --創(chuàng)建觸發(fā)器 create or replace trigger trigger3 after delete on job1 for each row begin insert into job1_log values(:old.job_id,:old.job_title,:old.min_salary,:old.max_salary); dbms_output.put_line('記錄已經(jīng)成功刪除并記錄到日志'); end;
觸發(fā)器創(chuàng)建完成后,可刪除job1表一行數(shù)據(jù)驗(yàn)證效果。
--測(cè)試 delete from job1 where job_id='ruirui';
效果如下:
--創(chuàng)建日志記錄表 create table test_log( l_user varchar2(15), l_type varchar2(15), l_date varchar2(20) ); --創(chuàng)建觸發(fā)器 create or replace trigger trigger4 after delete or insert or update on job1 declare v_type test_log.l_type%type; begin if deleting then v_type := 'delete'; dbms_output.put_line('記錄已經(jīng)成功刪除并記錄到日志'); elsif inserting then v_type := 'insert'; dbms_output.put_line('記錄已經(jīng)成功插入并記錄到日志'); elsif updating then v_type := 'update'; dbms_output.put_line('記錄已經(jīng)成功更新并記錄到日志'); end if; insert into test_log values(user,v_type,to_char(sysdate,'yyyy-mm-dd hh34:mi:ss')); end;
觸發(fā)器創(chuàng)建完成后,可更新job1表中數(shù)據(jù)驗(yàn)證效果。
--測(cè)試 insert into job1 values('rui1','Prisident',15000,30000);
update job1 set min_salary=20000 where job_id='rui1';
delete from job1 where job_id='rui1';
查詢test_log表中記錄如下:
select * from test_log;
案例5:創(chuàng)建觸發(fā)器,在刪除某條數(shù)據(jù)之前先在記錄表插入該條數(shù)據(jù)
--創(chuàng)建job1_log表用于記錄job1表的刪除記錄 create table test1_log as select * from job1 where 1<>1; --創(chuàng)建觸發(fā)器 create or replace trigger trigger5 before delete on job1 for each row --行級(jí)觸發(fā)器 begin insert into test1_log values(:old.job_id,:old.job_title,:old.min_salary,:old.max_salary); end;
觸發(fā)器創(chuàng)建完成后,可更新job1表中數(shù)據(jù)驗(yàn)證效果。
--測(cè)試 delete from job1 where job_id='rui2'; commit;
查詢test1_log表中記錄如下:
select * from test01_log;
到此,相信大家對(duì)“Oracle的觸發(fā)器trigger如何使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。