ORACLE PL/SQL 觸發(fā)器編程篇介紹
更新時間:2012年11月14日 15:12:22 作者:
ORACLE PL/SQL 觸發(fā)器能夠完成由數(shù)據(jù)庫的完整性約束難以完成的復(fù)雜業(yè)務(wù)規(guī)則的約束;監(jiān)視數(shù)據(jù)庫的各種操作以及實現(xiàn)審計功能
1.基本概念
兩種功能:完成由數(shù)據(jù)庫的完整性約束難以完成的復(fù)雜業(yè)務(wù)規(guī)則的約束;監(jiān)視數(shù)據(jù)庫的各種操作,實現(xiàn)審計功能。
觸發(fā)器分為:DML觸發(fā)器(對表或視圖執(zhí)行DML操作時觸發(fā)),INSTEAD OF觸發(fā)器(只定義在視圖上,替代實際的操作語句),系統(tǒng)觸發(fā)器(對數(shù)據(jù)庫系統(tǒng)進(jìn)行操作時觸發(fā),如DDL語句、啟動或關(guān)閉數(shù)據(jù)庫等)
觸發(fā)事件: 上述觸發(fā)器中括號內(nèi)容都是觸發(fā)事件。
觸發(fā)條件: WHEN子句
觸發(fā)對象:包括表、視圖、模式、數(shù)據(jù)庫。
觸發(fā)操作:觸發(fā)器自動執(zhí)行的程序。
觸發(fā)時機(jī):觸發(fā)器相對操作執(zhí)行的時間,BEFORE/AFTER
條件謂詞:INSERTING(觸發(fā)器事件為INSERT時為真),UPDATING,DELETING
觸發(fā)子類型:行觸發(fā)和語句觸發(fā),觸發(fā)中的new和old表。
2.創(chuàng)建觸發(fā)器
CREATE OR REPLACE TRIGGER<觸發(fā)器名>
觸發(fā)條件
觸發(fā)體
CREATE TRIGGER my_trigger --定義一個觸發(fā)器my—trigger
BEFORE INSERT or UPDATE of TID,TNAME on TEACHERS
FOR each row
WHEN(new.TNAME='David') --這一部分是觸發(fā)條件
DECLARE --下面這一部分是觸發(fā)體
teacher_id TEACHERS.TID%TYPE;
INSERT_EXIST_TEACHER EXCEPTION;
BEGIN
SELECT TID INTO teacher_id
FROM TEACHERS
WHERE TNAME=new.TNAME;
RAISE INSERT_EXIST_TEACHER;
EXCEPTION --異常處理也可用在這里
WHEN INSERT_EXIST_TEACHER THEN
INSERT INTO ERROR(TID,ERR)
VALUES(teacher_id,'the teacher already exists!');
END my triqqer;
3.執(zhí)行觸發(fā)器
自動執(zhí)行
CREATE TRIGGER my_trigger1
AFTER INSERT or UPDATE or DELETE on TEACHERS
FOR each row;
DECLARE
info CHAR(10);
BEGIN
IF inserting THEN --如果進(jìn)行插入操作
info:='INSERT';
ELSIF updating THEN --如果進(jìn)行修改操作
info:='Update';
ELSE--如果進(jìn)行刪除操作
info:='Delete';
END IF;
INSERT INTO SQL_INFO VALUES(info); --記錄這次操作信息
END my_trigger1;
4.刪除觸發(fā)器
DROP TRIGGER my_trigger;
兩種功能:完成由數(shù)據(jù)庫的完整性約束難以完成的復(fù)雜業(yè)務(wù)規(guī)則的約束;監(jiān)視數(shù)據(jù)庫的各種操作,實現(xiàn)審計功能。
觸發(fā)器分為:DML觸發(fā)器(對表或視圖執(zhí)行DML操作時觸發(fā)),INSTEAD OF觸發(fā)器(只定義在視圖上,替代實際的操作語句),系統(tǒng)觸發(fā)器(對數(shù)據(jù)庫系統(tǒng)進(jìn)行操作時觸發(fā),如DDL語句、啟動或關(guān)閉數(shù)據(jù)庫等)
觸發(fā)事件: 上述觸發(fā)器中括號內(nèi)容都是觸發(fā)事件。
觸發(fā)條件: WHEN子句
觸發(fā)對象:包括表、視圖、模式、數(shù)據(jù)庫。
觸發(fā)操作:觸發(fā)器自動執(zhí)行的程序。
觸發(fā)時機(jī):觸發(fā)器相對操作執(zhí)行的時間,BEFORE/AFTER
條件謂詞:INSERTING(觸發(fā)器事件為INSERT時為真),UPDATING,DELETING
觸發(fā)子類型:行觸發(fā)和語句觸發(fā),觸發(fā)中的new和old表。
2.創(chuàng)建觸發(fā)器
復(fù)制代碼 代碼如下:
CREATE OR REPLACE TRIGGER<觸發(fā)器名>
觸發(fā)條件
觸發(fā)體
復(fù)制代碼 代碼如下:
CREATE TRIGGER my_trigger --定義一個觸發(fā)器my—trigger
BEFORE INSERT or UPDATE of TID,TNAME on TEACHERS
FOR each row
WHEN(new.TNAME='David') --這一部分是觸發(fā)條件
DECLARE --下面這一部分是觸發(fā)體
teacher_id TEACHERS.TID%TYPE;
INSERT_EXIST_TEACHER EXCEPTION;
BEGIN
SELECT TID INTO teacher_id
FROM TEACHERS
WHERE TNAME=new.TNAME;
RAISE INSERT_EXIST_TEACHER;
EXCEPTION --異常處理也可用在這里
WHEN INSERT_EXIST_TEACHER THEN
INSERT INTO ERROR(TID,ERR)
VALUES(teacher_id,'the teacher already exists!');
END my triqqer;
3.執(zhí)行觸發(fā)器
自動執(zhí)行
復(fù)制代碼 代碼如下:
CREATE TRIGGER my_trigger1
AFTER INSERT or UPDATE or DELETE on TEACHERS
FOR each row;
DECLARE
info CHAR(10);
BEGIN
IF inserting THEN --如果進(jìn)行插入操作
info:='INSERT';
ELSIF updating THEN --如果進(jìn)行修改操作
info:='Update';
ELSE--如果進(jìn)行刪除操作
info:='Delete';
END IF;
INSERT INTO SQL_INFO VALUES(info); --記錄這次操作信息
END my_trigger1;
4.刪除觸發(fā)器
復(fù)制代碼 代碼如下:
DROP TRIGGER my_trigger;
相關(guān)文章
Oracle數(shù)據(jù)庫執(zhí)行慢問題排查詳細(xì)過程
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫執(zhí)行慢問題排查的詳細(xì)過程,在企業(yè)級應(yīng)用中,數(shù)據(jù)庫的穩(wěn)定性和性能是至關(guān)重要的,文中給出了詳細(xì)的代碼實例,需要的朋友可以參考下2023-07-07oracle 動態(tài)AdvStringGrid完美示例 (AdvStringGrid使用技巧/Cells)
本方法實現(xiàn)用常量和常量數(shù)組完美創(chuàng)建和控制動態(tài)TAdvStringGrid。2009-06-06Oracle 數(shù)據(jù)庫中創(chuàng)建合理的數(shù)據(jù)庫索引
在Oracle數(shù)據(jù)庫中,創(chuàng)建索引雖然比較簡單。但是要合理的創(chuàng)建索引則比較困難了。2009-06-06oracle實現(xiàn)將字段按逗號拼接/按逗號分為多行實例代碼
這篇文章主要給大家介紹了關(guān)于oracle實現(xiàn)將字段按逗號拼接/按逗號分為多行的相關(guān)資料,因為最近項目表里的某個字段存儲的值是以逗號分隔開來的,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-07-07CMD操作oracle數(shù)據(jù)導(dǎo)庫過程圖解
這篇文章主要介紹了CMD操作oracle數(shù)據(jù)導(dǎo)庫過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07oracle下巧用bulk collect實現(xiàn)cursor批量fetch的sql語句
oracle下巧用bulk collect實現(xiàn)cursor批量fetch的sql語句,使用oracel的朋友可以試試了2008-03-03Oracle動態(tài)視圖v$active_session_history實戰(zhàn)示例
這篇文章主要為大家介紹了Oracle動態(tài)視圖v$active_session_history實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03