Oracle資料庫 4 觸發器

2021-09-26 21:08:57 字數 3674 閱讀 6445

資料庫觸發器時儲存於資料庫的命令 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...