資料庫觸發器時儲存於資料庫的命令 pl/sql 語句塊,當觸發器發生時它們會隱含執行。執行觸發器的活動被稱為觸發觸發器。
觸發事件的中類:
處理資料庫表的 dml 語句 (insert , update, delete)。
ddl 語句 (如 create ,alter)
系統事件 ,如資料庫啟動或關閉。
使用者事件,如登入和登出。
建立觸發器通用語法:
括號中的保留字是可選的。
create [or replace] trigger trigger_name
trigger_enevt on table_name
[for each row] --指定行觸發器
[follows another_trigger] --跟隨另乙個觸發器
[enable/disable] --啟用/禁用
[when condition] --當滿足條件
declare
declaration statements --宣告引數
begin
executable statements --執行過程
exception
exception-handling statements --處理異常語句
end;
說明:
trigger_name:觸發器的名稱
before | after :指示何時觸發執行。(觸發事件發生 之前 / 之後 )。
trigger_enevt :dml 語句 (insert , update, delete)等。
for each row:指定行觸發器,只適用於所有的插入,修改或者刪除的資料行。
注意:
follows , enable和disable:是在 oracle 11g 中引入的,在 11g 之前,需要用 alter trigger 命令來啟用或者禁用觸發器。enable和disable 指定觸發器是在啟用,還是禁用狀態下被建立的。當觸發器被啟用時,觸發事件發生就會執行該觸發器。反之,當觸發器被禁用時,觸發事件發生時也不會執行該觸發器。當不使用 enable和disable 字句來建立觸發器時,在預設情況下是啟用的。
禁用觸發器執行:alter trigger trigger_name disable;
啟用之前被禁用的觸發器 :alter trigger trigger_name enable;
follows :可以指定觸發器被觸發的順序,這個選項適用於在相同表上所定義的,且在相同時間點會執行的觸發器。例如:如果在 person 表上定義兩個觸發器,並且在資料插入之前觸發,如果不使用 follows 字句,oracle 就無法保證這些觸發器始終按照相同的次序執行。
如果乙個表刪除了,則該錶上定義的觸發器也會被刪除。
示例1: 利用觸發器實現 id 編號 自增
1:建立序列:
-- create sequence
create sequence seq_name
minvalue 1 -最小值
maxvalue 9999999999999999999999999999 --最大值
start with 1 --從1開始自增
increment by 1 --每次增長 1
nocache; --不使用快取
2.建立觸發器
create or replace trigger tri_name
before insert on person
for each row
when (new.s_id is null)
begin
select seq_name.nextval into:new.s_id from dual; -- into 後面的 字段一定要加 : 號
end;
示例2:
建立觸發器,記錄表種刪除的資料:
create or replace trigger tri_oldinfo
after delete on person --
for each row
begin
insert into old_person values (:old.id, :old.name, :old.age, :old.***);--:old代表舊值
end;
示例3:
create or replace trigger tri_log
after delete or update or insert on person
declare
v_type varchar2(30) :='未知';
begin
if inserting then --當執行 insert 時
v_type :='insert';
elsif updating then --當執行 update 時
v_type :='update';
elsif deleting then --當執行 delete 時
v_type :='delete';
end if;
insert into loginfo values (user,v_type,sysdate); --記錄當前使用者,操作型別,和時間
end;
oracle觸發器 的三個謂語詞 inserting \ updating \ deleting
偽記錄: :new 和 :old
對於 insert 動作, :new可以獲取將要插入資料的新行。但是 :old未定義,值為null。
對於 delete 動作,:old可以獲取刪除的舊資料行。但是 :new未定義,值為null。
要注意 在when 語句的條件中使用時,:new 和 :old不在使用冒號作為字首。
示例4:在插入資料時完善錶行的資訊
create or replace trigger student_bi
before insert on srudent
for each row
declare
v_student_id student.student_id%type;
begin
select student_id_seq.nextval into v_student_id from dual;
:new.student_id :=v_student_id;
:new.create_by :=user;
:new.create_date:=sysdate;
end;
注意 ,在插入資料時,insert 語句必須包含觸發器提供值的列名。 oracle資料庫觸發器
instead of觸發器介紹 instead of觸發器代替觸發動作,並在處理約束之前激發 對於每個觸發操作,每個表或檢視都只能有乙個instead of觸發器。而乙個表對於每個觸發操作可以有多個after觸發器 instead of觸發器的建立模板 create or replace trigg...
Oracle資料庫update觸發器
在專案中使用到oracle資料庫的update觸發器,先記錄下來方便以後查閱。預備知識和格式以後再編輯吧,先把內容貼出來。create or replace trigger demo trigger after update on tb goods referencing new as new ol...
Oracle資料庫觸發器例項
需求 在修改表qdyth.jzfpjcxx時,要實時記錄表中的資料變動情況 協商後結果 建立新錶記錄資料變動情況 實現手段 資料庫觸發器 建立或修改觸發器 tr jzfpjcxx 2 create or replace trigger tr jzfpjcxx 2 觸發條件 before delete...