Oracle資料庫中的觸發器

2021-06-28 18:01:27 字數 4280 閱讀 3508

觸發器是一種特殊的儲存過程,它在發生某種資料庫事件時由oracle系統自動觸發。觸發器通常用於加強資料庫的完整性約束和業務規則等,對於表來說,觸發器可以實現比check約束更為複雜的約束。

oracle中的觸發器的型別主要有dml觸發器、替代觸發器、系統事件觸發器和ddl觸發器。

針對所有的dml事件,按照觸發器的觸發時間可以將dml觸發器分為before觸發器和after觸發器,分別表示在dml事件發生之前與之後採取行動。

before行觸發器

在開發資料庫應用時,為了確保資料符合商業或企業規則,應該使用約束對輸入資料加以限制,在某些情況下約束可能無法是想複雜的商業邏輯或企業規則,此時因考慮before行觸發器。

after行觸發器

為了審計dml操作,可以使用語句級觸發器或oracle提供的審計功能,而為了審計資料變化,則應使用after行觸發器。

另外,dml觸發器也可以分為語句級觸發器和行級觸發器,語句級觸發器針對某一條語句觸發一次,而行級觸發器針對語句所影響的每一行都觸發一次。

可以將dml操作細化到列,即針對某列進行dml操作時啟用觸發器。

在進行行級觸發器中,為了獲取某列在dml操作前後的資料,oracle提供了兩種特殊的標示符::old和:new,通過:old.column_name和:new.column_name分別獲取該列的舊資料和新資料。insert觸發器只能使用:new,delete只能使用:old,而update則兩種都可以使用。

例1:

create

user siege identified by

"123456";

grant

create

session

to siege;

grant

create

table

to siege;

grant

create tablespace to siege;

grant

create

view

to siege;

grant

create

anytrigger

to siege;

create tablespace learning;

size 100m

autoextend on next 5m maxsize 200m;

alter

user siege default tablespace leaning;

alter

user siege quota unlimited on leaning;

2.建立student表和record表,並插入相關資料:

create

table student(

sid number(4),

sname varchar2(10),

sage number(4)

);create

table record(

content varchar2(80),

rtime timestamp

);insert

into student values(1001,'candy',24);

insert

into student values(1002,'tracy',25);

insert

into student values(1003,'sam',23);

3.建立student表的觸發器:

create

orreplace

trigger update_student_trigger

after

update

on student

foreach

rowbegin

insert

into record values('執行了update操作,執行該操作前的資料為:sid='||:old.sid,sysdate);

end update_student_trigger;

4.測試觸發器:

修改student表資料:

update student set  sage=26;
此時檢視record資料,發現更新了3條資料,說明該觸發器為行觸發器:

1 執行了update操作,執行該操作前的資料為:sid=1001 15-feb-15 00.03.42.000000

2 執行了update操作,執行該操作前的資料為:sid=1002 15-feb-15 00.03.42.000000

3 執行了update操作,執行該操作前的資料為:sid=1003 15-feb-15 00.03.42.000000

例2:

針對例1中的student表進行建立檢視,其語句如下:

create

view student_view

asselect sid,sname,sage+1 new_age

from student

with

check

option;

建立好檢視後,進行插入操作:

insert

into student_view values(1004,'peter',22);

此時,報ora-01773錯誤。對此我們應該對student_view建立instead of觸發器:

create

orreplace

trigger insteadof_student_view

instead of

insert

on student_view

foreach

rowbegin

insert

into student (sid,sname,sage)

values(:new.sid,:new.sname,:new.new_age);

end insteadof_student_view;

建立好觸發器後,再次執行上面的插入語句,則可以成功進行插入了。

例3:以sysdba身份登入,建立table_event:

create

table table_event(

event varchar2(30),

time

date

)

然後建立tr_startup觸發器和tr_shutdown觸發器:

create

orreplace

trigger tr_startup

after startup on

database

begin

insert

into table_event values (ora_sysevent,sysdate);

end tr_startup;

create

orreplace

trigger tr_shutdown

before shutdown on

database

begin

insert

into table_event values (ora_sysevent,sysdate);

end tr_shutdown;

然後關閉和啟動資料庫,檢視table_event表:

shutdown 16/02/2015 01:01:02

startup 16/02/2015 01:01:56

說明系統觸發器已起作用了。

建立觸發器需要使用create trigger語句,其語法如下:

create [or

replace] trigger trigger_name

[before|after|instead of] trigger_event

[for

each

row]

[enable|disable]

[when trigger_condition]

[declare declaration_statements;]

begin

trigger_body;

end [trigger_name];

oracle資料庫觸發器

instead of觸發器介紹 instead of觸發器代替觸發動作,並在處理約束之前激發 對於每個觸發操作,每個表或檢視都只能有乙個instead of觸發器。而乙個表對於每個觸發操作可以有多個after觸發器 instead of觸發器的建立模板 create or replace trigg...

Oracle資料庫中的觸發器練習

一 表結構如圖,其中orders的orderid是主鍵,orderitem的orderid是外來鍵 orders表 create table orders 2 orderid number primary key,編號 3 ordername varchar2 32 名稱 4 orederprice...

Oracle資料庫update觸發器

在專案中使用到oracle資料庫的update觸發器,先記錄下來方便以後查閱。預備知識和格式以後再編輯吧,先把內容貼出來。create or replace trigger demo trigger after update on tb goods referencing new as new ol...