日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
詳解ORACLE觸發(fā)器(trigger)

觸發(fā)器是許多關(guān)系數(shù)據(jù)庫系統(tǒng)都提供的一項(xiàng)技術(shù)。在ORACLE系統(tǒng)里,觸發(fā)器類似過程和函數(shù),都有聲明,執(zhí)行和異常處理過程的PL/SQL塊。

1、觸發(fā)器說明

觸發(fā)器是一種在事件發(fā)生時(shí)隱式地自動(dòng)執(zhí)行的PL/SQL塊,不能接受參數(shù),不能被顯式調(diào)用。

2、觸發(fā)器類型

根據(jù)觸發(fā)器所創(chuàng)建的語句及所影響的對(duì)象的不同,將觸發(fā)器分為以下3類

(1)DML觸發(fā)器

對(duì)數(shù)據(jù)表進(jìn)行DML語句操作(如insert、update、delete)時(shí)所觸發(fā)的觸發(fā)器,可以分為:

語句級(jí)觸發(fā)器或行級(jí)觸發(fā)器:行級(jí)觸發(fā)器會(huì)對(duì)數(shù)據(jù)庫表中的受影響的每一行觸發(fā)一次觸發(fā)器代碼,語句級(jí)觸發(fā)器則只觸發(fā)一次,與語句所影響到的行數(shù)無關(guān)

before觸發(fā)器或after觸發(fā)器:before觸發(fā)器在觸發(fā)事件發(fā)生之前執(zhí)行觸發(fā)器代碼,after觸發(fā)器則在觸發(fā)事件發(fā)生之后執(zhí)行

語法:

create [or replace] trigger trigger_name
{before | after} trigger_event
on table_name
[for each row]
[when trigger_condition]
trigger_body

語法解釋:

trigger_name:觸發(fā)器名稱

before | after : 指定觸發(fā)器是在觸發(fā)事件發(fā)生之前觸發(fā)還暗示發(fā)生之后觸發(fā)

trigger_event:觸發(fā)事件,在DML觸發(fā)器中主要為insert、update、delete等

table_name:表名,表示發(fā)生觸發(fā)器作用的對(duì)象

for each row:指定創(chuàng)建的是行級(jí)觸發(fā)器,若沒有該子句則創(chuàng)建的是語句級(jí)觸發(fā)器

when trigger_condition:添加的觸發(fā)條件

trigger_body:觸發(fā)體,是標(biāo)準(zhǔn)的PL/SQL語句塊

(2)替代觸發(fā)器(instead of觸發(fā)器)

對(duì)視圖進(jìn)行操作時(shí)定義的觸發(fā)器,替代觸發(fā)器只能定義在視圖上

語法:

create [or replace] trigger trigger_name --觸發(fā)器名稱
instead of trigger_event --觸發(fā)事件
on view_name --視圖名稱
for each row  --替代觸發(fā)器必須指定為行級(jí)的觸發(fā)器
[when trigger_condition] --觸發(fā)條件
trigger_body --觸發(fā)體,PL/SQL塊

(3)系統(tǒng)事件觸發(fā)器

對(duì)數(shù)據(jù)庫實(shí)例或某個(gè)用戶模式進(jìn)行操作時(shí)定義的觸發(fā)器,可以分為:

數(shù)據(jù)庫系統(tǒng)觸發(fā)器和用戶觸發(fā)器。

3、案例

(1)DML觸發(fā)器

DML觸發(fā)器的案例都是基于student表和stu_log表來進(jìn)行的,所以先創(chuàng)建student表和stu_log表

create table STUDENT   ---創(chuàng)建student表
(
 id        NUMBER(19), --id
 stu_no    VARCHAR2(20), --學(xué)號(hào)
 stu_name  VARCHAR2(32), --姓名
 stu_age   NUMBER,  --年齡
 stu_major VARCHAR2(32) --專業(yè)
)
create table STU_LOG   ---創(chuàng)建stu_log表,用于記錄對(duì)student表的操作日志
(
 log_id     NUMBER,  --日志id
 log_action VARCHAR2(100),  --操作名稱
 log_date   DATE,  --操作時(shí)間
 log_message   VARCHAR2(32) --
)

a、行級(jí)觸發(fā)器(before觸發(fā)器)

創(chuàng)建觸發(fā)器:實(shí)現(xiàn)id的隱式自增

create or replace trigger modify_stu
before insert on student
for each row
declare
next_id number;
begin
 select seq_test.nextval into next_id from dual;
 :new.id :=next_id;
end;

插入一條數(shù)據(jù),但是不插入id

insert into student(stu_no,stu_name,stu_age,stu_major) values('NO1','張三',20,'中文系');

查詢結(jié)果如下,自動(dòng)生成id了:

b、 行級(jí)觸發(fā)器(after觸發(fā)器)

創(chuàng)建觸發(fā)器:將對(duì)student表的操作都記錄到stu_log表中(update of 用于指定一個(gè)或多個(gè)字段,指定字段被更新時(shí)才會(huì)觸發(fā)觸發(fā)器)

create or replace trigger modify_stu
after insert or delete or update of stu_name
on student
for each row
 begin
   if inserting then
     insert into stu_log values(1,'insert',sysdate,:new.stu_name);
   elsif deleting then
      insert into stu_log values(2,'delete',sysdate,:old.stu_name);
   elsif updating then
     insert into stu_log values(3,'update_old',sysdate,:old.stu_name);
     insert into stu_log values(4,'update_new',sysdate,:new.stu_name);
    end if;
end;
insert into student values(1,'NO2','李四',21,'數(shù)學(xué)系');  --插入一條數(shù)據(jù)
delete student where stu_name='張三';   --刪除一條數(shù)據(jù)
update student set stu_age=19 where stu_name='李四';  --修改李四的年齡
update student set stu_name='王二' where stu_name='李四';  --修改李四的名稱

查詢stu_log表的結(jié)果如下,第3條update語句沒有觸發(fā)該觸發(fā)器,因?yàn)橛|發(fā)器指定只有修改stu_name字段才會(huì)觸發(fā)觸發(fā)器:

ORACLE觸發(fā)器(trigger)的使用ORACLE觸發(fā)器(trigger)的使用

c、語句級(jí)觸發(fā)器(before觸發(fā)器):用來控制對(duì)表的修改

create or replace trigger modify_stu
before insert or update or delete on student
begin
  if deleting then
    raise_application_error(-20001,'該表不允許刪除數(shù)據(jù)');
  elsif updating then
    raise_application_error(-20002,'該表不允許修改數(shù)據(jù)');
   elsif inserting then
    raise_application_error(-20003,'該表不允許插入數(shù)據(jù)');
   end if;
end;

插入數(shù)據(jù)時(shí)報(bào)錯(cuò)如下,刪除和修改數(shù)據(jù)同樣也報(bào)錯(cuò):


文章標(biāo)題:詳解ORACLE觸發(fā)器(trigger)
路徑分享:http://m.5511xx.com/article/cdpihdc.html