觸發器是一種特殊的儲存過程,它在發生某種資料庫事件時由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:2 執行了update操作,執行該操作前的資料為:sid=1002 15-feb-15 00.03.42.000000
3 執行了update操作,執行該操作前的資料為:sid=1003 15-feb-15 00.03.42.000000
針對例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...