亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle中觸發器示例詳解

2024-08-29 14:01:13
字體:
來源:轉載
供稿:網友

前言

在ORACLE系統里,觸發器類似過程和函數,都有聲明,執行和異常處理過程的PL/SQL塊。

觸發器類型

觸發器在數據庫里以獨立的對象存儲,它與存儲過程和函數不同的是,存儲過程與函數需要用戶顯示調用才執行,而觸發器是由一個事件來啟動運行。即觸發器是當某個事件發生時自動地隱式運行。并且,觸發器不能接收參數。所以運行觸發器就叫觸發或點火(firing)。ORACLE事件指的是對數據庫的表進行的INSERT、UPDATE及DELETE操作或對視圖進行類似的操作。ORACLE將觸發器的功能擴展到了觸發ORACLE,如數據庫的啟動與關閉等。所以觸發器常用來完成由數據庫的完整性約束難以完成的復雜業務規則的約束,或用來監視對數據庫的各種操作,實現審計的功能。

開發中肯定會用到Oracle的觸發器,本文進行詳細講解。

這里實例中用到的主要是Oracle中scott用戶下的emp以及dept表,數據如下

Oracle,觸發器Oracle,觸發器

一、觸發器概念

1、概念:

觸發器的本質是一個存儲過程,顧名思義發生特定事件時Oracle會執行觸發器中的代碼。細分它的組成可以分為3個部分:第一部分在什么條件下觸發器會執行,即觸發器被觸發的事件。第二部分在什么時間點執行觸發器即觸發器的發生事件例如before,after。第三部分觸發器自身所要做的事情,就是觸發器被觸發以后具體想表達的事件,在begin和end之間的sql。

二、觸發器的分類:

1、ddl觸發器:即執行ddl操作后所觸發的事件。

常用的ddl操作有:grant(授權),revoke(撤銷授權),create(創建),drop(刪除),alter(修改),comment(注釋),audit(審核),rename(重命名)在進行具體實例以前先來講解另一個概念:oracle中的user和schema:

user:oracle中的用戶,擁有數據庫的對象以及對數據庫對象增刪改查的權限。schema:該用戶下所有數據庫對象的集合Collection.類似于生活中房子schema和房子的擁有者user之間的關系,你是一個用戶user你可以通過alter session查看別人的房子,但是你是否可以改變房子中的家具,要看這個房子的擁有者是否grant你這個權限,除非你是所有房子的最高權限人dba。

ddl Example:禁止scott用戶的所有ddl操作

CREATE OR REPLACE TRIGGER scott_triggerBEFORE DDLON SCHEMABEGIN RAISE_APPLICATION_ERROR(-20008,'禁止scott用戶的所有ddl操作');END;
create sequence myseq;

Oracle,觸發器

這里看到在創建觸發器以后如果仍然使用ddl操作,便會報錯。

2、dml觸發器:基于dml操作的觸發器,細分又可以分為行觸發器和語句觸發器。

A、語句觸發器:dml操作可能會影響很多行,主要用于對數據的安全保護。

Example:禁止在周四,周五修改emp表數據

CREATE OR REPLACE TRIGGER emp_triggerBEFORE UPDATE OR DELETE OR INSERTON empBEGIN IF to_char(sysdate,'day') IN ('星期四','星期五') THEN RAISE_APPLICATION_ERROR(-20008,'不允許在周四周五修改emp表'); END IF;END;
update emp set sal=800;

Oracle,觸發器

這里建立觸發器以后,當你想改變所有人的工資時就會出觸發器的錯誤,所有人的工資即表示會影響很多行。

B、行級觸發器:針對需要操作的那一行,有關鍵詞:for each row,用來

(1)實現數據的審計功能:

Example:做一個記錄刪除員工信息的表記錄被刪除員工的信息

這里為了不改變oracle中emp表的數據,新建一個emp_new表

create table emp_newasselect * from emp;
create table emp_audit(name varchar2(10),delete_time Date);
CREATE OR REPLACE TRIGGER delete_triggerAFTER DELETE ON emp_newFOR EACH ROWBEGIN INSERT INTO emp_audit values(:old.ename,sysdate);END;
delete from emp_new where empno='7499';
select * from emp_audit;

Oracle,觸發器

這里可以看到在創建觸發器時,用到了for each row關鍵詞,:old.***用來表示更改以前的表中的數據,:new.***用來表示更改以后的數據,在刪除數據以后在日志表就有對應的記錄。

(2)實現數據完整性:

Example:要求員工漲工資后,不能低于原來的工資,所漲工資也不能高于原來的50%。

這里為了不改變oracle中emp表的數據,新建一個emp_new表

create table emp_newasselect * from emp;
CREATE OR REPLACE TRIGGER emp_triggerBEFORE UPDATE OF sal ON emp_newFOR EACH ROWWHEN (new.sal<old.sal OR new.sal>1.5*old.sal)BEGIN RAISE_APPLICATION_ERROR(-20008,'工資只增不降,且漲幅不可大于50%');END;
update emp_new set sal = 1.6*sal where empno='7788';

Oracle,觸發器

這里可以看到當改變數據時會觸發觸發器錯誤,對表中某一個字段的修改用UPDATE OF即可,另外如果new和old在PLSQL塊的外部即BEGIN外面不可以加冒號。

(3)參照完整性:

Example:主要用于級聯更新,如更新dept表中的deptno時,emp表的deptno也更新。

這里仍然新建2個表分別和emp表dept表的數據相同。

create table emp_newasselect * from emp;
create table dept_newasselect * from dept;
CREATE OR REPLACE TRIGGER cascade_triggerAFTER UPDATE OF deptno ON dept_newFOR EACH ROWBEGIN UPDATE emp_new SET deptno=:new.deptno WHERE deptno=:old.deptno;END;
update dept_new set deptno=15 where deptno=20;
select * from dept_new;

Oracle,觸發器

select * from emp_new;

Oracle,觸發器

這里參照完整新指具有主從關系的多個表,當更新主表主鍵時需要更新從表的相關數據。

3、替代觸發器:

這里先講另一個概念:帶有with check option的視圖:

如果視圖的定義包括條件(如where子句)并且任何應用于該視圖的INSERT或UPDATE語句都應包括該條件,則必須使用WITH CHECK OPTION定義該視圖。

Example:

CREATE VIEW emp_view(ename,empno)AS SELECT ename,empno FROM emp WHERE deptno=20WITH CHECK OPTION;

這里有個條件部門號為20,則任何修改這個視圖的語句都必須針對的是20號部門的員工。

繼續替代觸發器的概念:關鍵字insteadof,主要針對一些復雜的視圖,因為級聯表所產生的視圖不可以使用update,insert,delete等關鍵字,沒有before,after等關鍵字,并且不可以建立在with check option選項的視圖上,比如新建一個emp表和dept表的級聯視圖,則不可以向其中添加數據,現在通過觸發器解決:

Example:

仍然新建2個表分別和emp表dept表的數據相同。

CREATE TABLE emp_newASSELECT * FROM emp;CREATE TABLE dept_newASSELECT * FROM dept;
CREATE VIEW emp_deptASSELECT d.deptno,d.dname,e.empno,e.enameFROM dept_new d,emp_new eWHERE d.deptno=e.deptno;

這里scott用戶需要先通過sysdba授權才能建立視圖:

grant create view to scott;
CREATE OR REPLACE TRIGGER insteadof_triggerINSTEAD OF INSERT ON emp_deptFOR EACH ROWDECLARE v_temp INT;BEGIN SELECT COUNT(*) INTO v_temp FROM dept_new WHERE deptno=:new.deptno; IF v_temp=0 THEN  INSERT INTO dept_new(deptno,dname) VALUES(:new.deptno,:new.dname); END IF;  SELECT COUNT(*) INTO v_temp FROM emp_new WHERE empno=:new.empno; IF v_temp=0 THEN  INSERT INTO emp_new(deptno,empno,ename) VALUES(:new.deptno,:new.empno,:new.ename); END IF;END;
INSERT INTO emp_dept values(15,'HUMANRESOURCE',7999,'LEAF');
select * from emp_new;

Oracle,觸發器

select * from dept_new;

Oracle,觸發器

這里觸發器中當對視圖進行insert時,會對相應的emp_new 和dept_new進行修改,也就做到了對復雜視圖的修改。

4、系統觸發器:顧名思義,由系統觸發器所觸發的事件,常用的系統事件startup,shutdown,db_roll_change,server error等。

Example:記錄啟動數據庫時的事件以及時間。

此處因為是系統觸發器,所以需要用sysdba的權限登陸。

CREATE TABLE event_table(event VARCHAR2(50),event_time DATE);
CREATE OR REPLACE TRIGGER event_triggerAFTER STARTUP ON DATABASEBEGIN INSERT INTO event_table VALUES(ora_sysevent,sysdate);END;

Oracle,觸發器

select * from event_table;

Oracle,觸發器

三、觸發器的綜合實例

Example:做一個日志用來記錄scott用戶的一些操作:

首先在sysdba權限下建立日志表,序列,觸發器:

CREATE TABLE object_log(logid NUMBER CONSTRAINT pk_logid PRIMARY KEY,operatedate DATE NOT NULL,objecttype VARCHAR2(50) NOT NULL,objectowner VARCHAR2(50) NOT NULL);
CREATE SEQUENCE obj_log_seq;
CREATE OR REPLACE TRIGGER object_triggerAFTER CREATE OR DROP OR ALTER ON DATABASEBEGIN INSERT INTO object_log VALUES(obj_log_seq.nextval,sysdate,ora_dict_obj_type,ora_dict_obj_owner);END;

在scott用戶下隨便創建個東西:

CREATE SEQUENCE my_seq;

回到sysdba權限下查看日志表中是否有對應的記錄:

SELECT * FROM object_log;

Oracle,觸發器

發現有數據,說明一個日志表成功做好,監視一些用戶操作的觸發器就做好了。至此,觸發器全部說明完畢,不足之處還請評論說明,謝謝。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到oracle教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久成人| 一区二区在线视频| 91伊人影院在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 45www国产精品网站| 亚洲欧美中文在线视频| 日韩欧美国产黄色| 国产亚洲精品美女久久久| 欧美老女人性视频| 亚洲第一精品夜夜躁人人躁| 国产精品偷伦免费视频观看的| 欧美激情国产日韩精品一区18| 91精品视频免费观看| 欧美第一黄色网| 国产日韩在线播放| 一本大道亚洲视频| 国产欧美日韩中文字幕| 精品视频偷偷看在线观看| 欧美日韩色婷婷| 88国产精品欧美一区二区三区| 日韩电影中文字幕| 97久久精品国产| 91亚洲精品在线| 日本三级韩国三级久久| 亚洲激情视频网| 欧美剧在线观看| 日韩欧美第一页| 欧美一区二区色| 在线播放国产一区二区三区| 97视频免费观看| 91精品久久久久| 91av网站在线播放| 成人深夜直播免费观看| 国产亚洲精品综合一区91| 久久久精品免费| 国产精品久久久久aaaa九色| 色爱av美腿丝袜综合粉嫩av| 91九色精品视频| 欧美性理论片在线观看片免费| 亚洲欧洲在线观看| 亚洲一区999| 欧美wwwxxxx| 中文字幕亚洲精品| 国产中文字幕日韩| 97国产精品人人爽人人做| 久久韩剧网电视剧| 91免费的视频在线播放| 久久理论片午夜琪琪电影网| 91精品国产91久久久久福利| 国产精品电影久久久久电影网| 26uuu久久噜噜噜噜| 97视频在线观看亚洲| 在线观看国产精品日韩av| 亚洲黄页网在线观看| 51精品在线观看| 欧美日韩国产精品一区二区三区四区| 国产精品999| 亚洲精品一区二区在线| 欧美激情视频网址| 成人黄色av播放免费| 欧美大尺度在线观看| 亚洲成人黄色在线| 成人黄色免费在线观看| 中文字幕免费国产精品| 一区二区成人精品| 欧洲成人免费视频| 久久视频精品在线| 91成人免费观看网站| 午夜精品久久久久久久99黑人| 色与欲影视天天看综合网| 国产精品第一第二| 韩国福利视频一区| 亚洲国产精品va| 亚洲欧美国产一本综合首页| 亚洲人成伊人成综合网久久久| 亚洲综合第一页| 最近的2019中文字幕免费一页| xxx欧美精品| 欧美区在线播放| 国产成人福利夜色影视| 青青a在线精品免费观看| 亚洲人成网7777777国产| 国产福利精品视频| 国产精品白嫩初高中害羞小美女| 一区二区三区四区在线观看视频| 亚洲视频自拍偷拍| 少妇高潮久久77777| 国产精品com| 国产精品久久久久久久久粉嫩av| 黑丝美女久久久| 久久精品美女视频网站| 国产亚洲视频在线观看| 成人在线免费观看视视频| 一本色道久久综合亚洲精品小说| 国产精品日韩在线| 精品国产欧美一区二区三区成人| 亚洲精品福利在线观看| 国产在线精品成人一区二区三区| 一区二区三区视频免费| 有码中文亚洲精品| 久久久国产一区二区| 国产aaa精品| 日本乱人伦a精品| 国产人妖伪娘一区91| 97在线视频免费| 欧美色xxxx| 中文日韩在线视频| 庆余年2免费日韩剧观看大牛| 98精品国产自产在线观看| 国产999精品久久久| 久久777国产线看观看精品| 欧美二区乱c黑人| 亚洲美腿欧美激情另类| 欧美性猛交xxxx富婆弯腰| 91国产精品视频在线| 亚洲欧美视频在线| 韩国一区二区电影| 欧美大尺度激情区在线播放| 性欧美办公室18xxxxhd| 国产精品精品久久久| 国产欧美va欧美va香蕉在| 欧亚精品在线观看| 欧美不卡视频一区发布| 亚洲男人的天堂在线| 亚洲国产日韩精品在线| 色综合视频一区中文字幕| 久久精品亚洲国产| 欧美裸身视频免费观看| 狠狠色狠狠色综合日日小说| 欧美午夜片在线免费观看| 欧美最猛性xxxxx免费| 欧美高清在线视频观看不卡| 欧美自拍大量在线观看| 久久久成人精品视频| 日韩av电影在线免费播放| 欧美电影免费观看高清| 2019国产精品自在线拍国产不卡| 欧美激情区在线播放| 久久频这里精品99香蕉| 久久韩国免费视频| 最近免费中文字幕视频2019| 精品日韩美女的视频高清| 操日韩av在线电影| 免费99精品国产自在在线| 亚洲精品日产aⅴ| 久久伊人91精品综合网站| 欧美日本啪啪无遮挡网站| 国产不卡精品视男人的天堂| 福利视频一区二区| 最近2019年好看中文字幕视频| 成人精品一区二区三区电影黑人| 日韩高清有码在线| 91在线精品视频| 国产精品第8页| 日韩av片免费在线观看| 国产一区私人高清影院| 91欧美精品成人综合在线观看| 全球成人中文在线| 日韩在线视频免费观看高清中文| 精品久久香蕉国产线看观看gif| 欧美激情喷水视频| 色狠狠久久aa北条麻妃| 久久久精品2019中文字幕神马| 久久久视频在线|