婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Oracle中觸發器示例詳解

Oracle中觸發器示例詳解

熱門標簽:海南400電話哪里辦理 圖像地圖標注 濟南地圖標注公司 400電話是不是免費申請 呼倫貝爾智能手機地圖標注 分布式呼叫中心 貴陽電話外呼系統哪家好 安陽外呼系統免費 南寧人工智能電銷機器人費用

前言

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

觸發器類型

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

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

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

一、觸發器概念

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_trigger
BEFORE DDL
ON SCHEMA
BEGIN
 RAISE_APPLICATION_ERROR(-20008,'禁止scott用戶的所有ddl操作');
END;
create sequence myseq;

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

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

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

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

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

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

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

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

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

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

create table emp_new
as
select * from emp;
create table emp_audit(name varchar2(10),delete_time Date);
CREATE OR REPLACE TRIGGER delete_trigger
AFTER DELETE ON emp_new
FOR EACH ROW
BEGIN
 INSERT INTO emp_audit values(:old.ename,sysdate);
END;
delete from emp_new where empno='7499';
select * from emp_audit;

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

(2)實現數據完整性:

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

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

create table emp_new
as
select * from emp;
CREATE OR REPLACE TRIGGER emp_trigger
BEFORE UPDATE OF sal ON emp_new
FOR EACH ROW
WHEN (new.salold.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';

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

(3)參照完整性:

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

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

create table emp_new
as
select * from emp;
create table dept_new
as
select * from dept;
CREATE OR REPLACE TRIGGER cascade_trigger
AFTER UPDATE OF deptno ON dept_new
FOR EACH ROW
BEGIN
 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;

select * from emp_new;

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

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=20
WITH CHECK OPTION;

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

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

Example:

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

CREATE TABLE emp_new
AS
SELECT * FROM emp;
CREATE TABLE dept_new
AS
SELECT * FROM dept;
CREATE VIEW emp_dept
AS
SELECT d.deptno,d.dname,e.empno,e.ename
FROM dept_new d,emp_new e
WHERE d.deptno=e.deptno;

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

grant create view to scott;
CREATE OR REPLACE TRIGGER insteadof_trigger
INSTEAD OF INSERT ON emp_dept
FOR EACH ROW
DECLARE
 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;

select * from dept_new;

這里觸發器中當對視圖進行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_trigger
AFTER STARTUP ON DATABASE
BEGIN
 INSERT INTO event_table VALUES(ora_sysevent,sysdate);
END;

select * from event_table;

三、觸發器的綜合實例

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_trigger
AFTER CREATE OR DROP OR ALTER ON DATABASE
BEGIN
 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中通過觸發器記錄每個語句影響總行數
  • Oracle觸發器trigger詳解
  • Oracle觸發器用法實例詳解
  • oracle監控某表變動觸發器例子(監控增,刪,改)
  • Oracle創建主鍵自增表(sql語句實現)及觸發器應用
  • Oracle中游標Cursor基本用法詳解
  • Oracle存儲過程游標用法分析
  • Oracle顯示游標的使用及游標for循環
  • 快速學習Oracle觸發器和游標

標簽:許昌 郴州 焦作 南充 合肥 涼山 遼源 滁州

巨人網絡通訊聲明:本文標題《Oracle中觸發器示例詳解》,本文關鍵詞  Oracle,中,觸發器,示例,詳解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Oracle中觸發器示例詳解》相關的同類信息!
  • 本頁收集關于Oracle中觸發器示例詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    免费不卡在线观看| 天堂精品中文字幕在线| 亚洲在线视频免费观看| 精品在线你懂的| 一本色道久久综合亚洲精品按摩| 欧美猛男gaygay网站| 国产精品视频第一区| 日韩激情一二三区| 91精品福利在线| 国产精品久久午夜| 激情综合色综合久久综合| 色丁香久综合在线久综合在线观看| 日韩三级视频在线看| 亚洲精品大片www| 成人综合婷婷国产精品久久蜜臀| 555www色欧美视频| 亚洲成av人片在线| 色吊一区二区三区| 中文字幕欧美三区| 精品亚洲成a人| 日韩精品一区二区三区四区视频| 亚洲成年人影院| 色94色欧美sute亚洲线路一ni| 国产精品美女久久久久久久| 国产精品主播直播| www欧美成人18+| 精品亚洲国内自在自线福利| 欧美成人伊人久久综合网| 天天色图综合网| 精品视频在线免费观看| 亚洲五月六月丁香激情| 色婷婷久久久综合中文字幕 | 欧美高清在线一区二区| 日本成人中文字幕| 欧美性生活影院| 亚洲欧洲三级电影| 丁香啪啪综合成人亚洲小说 | 欧美一区二区性放荡片| 一区二区在线电影| 91在线观看成人| 中文字幕一区二区三中文字幕| 精品一区二区三区在线视频| 欧美一区二区免费视频| 午夜精品国产更新| 欧美日韩国产另类一区| 亚洲男人天堂一区| 色婷婷精品久久二区二区蜜臀av | 亚洲黄色免费网站| 色婷婷综合久久久中文字幕| 一区二区三区欧美| 一本色道久久综合亚洲91| 亚洲人快播电影网| 色婷婷精品大在线视频| 欧美电视剧在线观看完整版| 国产精品白丝jk黑袜喷水| 久久青草国产手机看片福利盒子 | 亚洲一区二区欧美日韩| 一本一本久久a久久精品综合麻豆| 亚洲免费av网站| 91美女蜜桃在线| 夜夜夜精品看看| 欧美色图在线观看| 亚洲123区在线观看| 欧美人妖巨大在线| 久久福利视频一区二区| 久久久久国产精品麻豆| 国模套图日韩精品一区二区| 欧美一区二区三区在线电影| 风流少妇一区二区| 亚洲男人电影天堂| 欧美日本一道本| 国产精品1区二区.| 亚洲人成在线观看一区二区| 欧美日韩亚洲另类| 国产老妇另类xxxxx| 中文字幕一区二区三区蜜月| 在线视频国内一区二区| 蜜桃精品视频在线| 国产精品色一区二区三区| 在线视频一区二区三区| 蜜桃av一区二区三区电影| 中文字幕精品—区二区四季| 欧美在线免费观看视频| 日韩中文欧美在线| 777久久久精品| 在线观看视频一区二区| 久久精品国产999大香线蕉| 亚洲视频中文字幕| 日韩三区在线观看| 91碰在线视频| 国内精品伊人久久久久av一坑| 国产精品免费视频一区| 欧美妇女性影城| 成人免费看黄yyy456| 亚洲精品精品亚洲| 久久久久国产精品人| 正在播放一区二区| 国产成人av资源| 日韩va欧美va亚洲va久久| 国产精品久久久一本精品| 91精品在线观看入口| 91一区二区三区在线播放| 麻豆91精品91久久久的内涵| jlzzjlzz欧美大全| 亚洲欧洲性图库| av不卡在线播放| 亚洲精品v日韩精品| 欧美大尺度电影在线| 国产91清纯白嫩初高中在线观看| 老汉av免费一区二区三区| 亚洲影院免费观看| 亚洲国产欧美另类丝袜| 一区在线观看视频| 国产亚洲精品中文字幕| 精品国产伦一区二区三区观看体验 | 欧美视频你懂的| 99久精品国产| 国产精品一品二品| 狠狠色综合日日| 亚洲成人免费在线| 亚洲一区二区在线观看视频| 亚洲同性同志一二三专区| 欧美国产97人人爽人人喊| 欧美国产一区在线| 久久精品夜色噜噜亚洲a∨| www国产亚洲精品久久麻豆| 日韩三级中文字幕| 欧美电视剧在线观看完整版| 日韩亚洲欧美成人一区| 欧美性受xxxx| 精品视频免费在线| 欧美美女直播网站| 7777精品久久久大香线蕉| 欧美区一区二区三区| 7777精品伊人久久久大香线蕉完整版| 欧美高清视频在线高清观看mv色露露十八 | 国产精品国产三级国产专播品爱网| 久久一日本道色综合| xfplay精品久久| 国产日产欧产精品推荐色| 国产清纯美女被跳蛋高潮一区二区久久w| 国产午夜亚洲精品羞羞网站| 国产精品三级视频| 亚洲免费观看高清在线观看| 国产精品久久久久久久久免费桃花| 精品国产一区a| 亚洲精品在线免费观看视频| 91精品福利在线一区二区三区| 欧美久久婷婷综合色| 日韩精品专区在线| 久久精品这里都是精品| 自拍偷拍亚洲激情| 亚洲影视在线观看| 九九在线精品视频| 91网站视频在线观看| 成人爱爱电影网址| 国产91精品一区二区麻豆亚洲| 国产99久久久久久免费看农村| 成人丝袜18视频在线观看| 日本韩国一区二区三区视频| 欧美另类久久久品| 国产拍欧美日韩视频二区| 亚洲靠逼com| 久久国产精品区| 91亚洲国产成人精品一区二区三| 777a∨成人精品桃花网| 日韩三级av在线播放| 中文字幕一区日韩精品欧美| 亚洲成人动漫在线观看| 国产一区二区在线免费观看| 一本高清dvd不卡在线观看| 日韩午夜精品电影| 亚洲人成人一区二区在线观看 | 波多野洁衣一区| 91 com成人网| 国产精品美女久久福利网站| 蜜桃视频在线一区| 欧美日韩一区二区在线视频| 久久精品水蜜桃av综合天堂| 午夜国产不卡在线观看视频| 成人免费看片app下载| 精品国产青草久久久久福利| 亚洲自拍偷拍麻豆| 97se亚洲国产综合自在线| 欧美日韩国产成人在线91| 亚洲欧美在线观看| 国产精品 日产精品 欧美精品| 欧美肥妇毛茸茸| 亚洲免费视频成人| 岛国精品一区二区| 日韩欧美激情四射| 亚洲一区二区视频在线观看| 国产一区视频网站| 欧美色视频一区| 樱花草国产18久久久久| av在线播放成人| 国产精品美女久久久久久久久 | 日日欢夜夜爽一区| 成人午夜电影小说| xnxx国产精品|