Oracle觸發器的概念以及寫法講解

2021-12-30 07:28:57 字數 4764 閱讀 7116

觸發器是儲存在伺服器中的程式單元,當資料庫中某些事件發生時(比如insert\update\delete),資料庫自動啟動觸發器,執行觸發器中的相應操作。

(1) 觸發器是一種特殊的儲存過程,具備事務的功能;

(2) 觸發器不能被直接呼叫,而是由事件來觸發;--例如:增刪改

(3) 觸發器常用於加強資料的完整性約束和業務規則等。

簡單點說:觸發器就是個開關,燈就是開關觸發後的操作,觸動了開關燈就亮了。

insert,update,delete,create(建立物件時),alter,drop

logon/logoff(使用者的登入或登出時執行觸發器)

startup/shutdown(資料庫開啟或關閉時執行觸發器)。

before 在指定的事件發生之前執行觸發器

after 在指定的事件發生之後執行觸發器

行觸發:對觸發事件影響的每一行執行觸發器,即觸發機制是基於行的。改一行資料,觸發一次。

該型別觸發器將在insert\update\delete操作完成以後觸發,即after。(也就是增刪改都用after)

關鍵語句:for each row

--案例2

create or replace tirgger t_mydel

after delete

on stuinfo

for each row

begin

dbms_output.put_line('刪的好!');

end;

--執行(刪除了一條記錄,結果顯示一條'刪的好')

delete from stuinfo where stuname='李文才';

--執行(刪除了整個表中的記錄,顯示n條'刪的好')

delete from stuinfo

--說明:這就是講解行級觸發器。

--行級觸發器:一條條的刪,刪一條就觸發乙個行級觸發器。

--語句級觸發器:執行一條觸發一次。

語句觸發:對觸發事件只能觸發一次,而且不能該問受觸發器影響的每一行的值。既無論這條sql語句影響多少條記錄,觸發器都只觸發一次。

create [or replace] trigger trigger_name

after|before|instead of --instead反向

[insert][[or] update [of 列列表]][[or] delete]

on table表或view

[for each row] --行級模式

begin

--pl/sql語句(begin...end)

end;

案例1:

--建立乙個觸發器tig_1,當使用者刪除scott.emp表中的資料時提示。

sql>create or replace trigger tig_1

after delete

on scott.emp //注意:這裡沒有用for each row,即不管刪除多少條,只觸發一次該觸發器

begin

if deleting then

dbms_output.put_line('有使用者刪除了emp表中的資料!');

end if;

end;

案例2:

--建立乙個觸發器tig_2,當表scott.dept中的deptno列的值發生變化時,自動更新表scott.emp中的deptno列的值,從而保證資料的完整性。

sql>create or replace trigger tig_2

after update

on scott.emp

for each row

begin

update scott.emp set deptno = :new.deptno

where deptno = :old.deptno;

end;

注意:這段程式中有兩個概念:new和:old, :new代表執行更新操作之後的新錶,:old代表執行更新操作之前的舊表。

通過這兩張表的使用,可以訪問到觸發器執行前後表資料的變化。

insert操作只有:new,delete操作只有:old,update操作二者皆有。

:new 和 :old只用於行級觸發器。

--:new表,將插入的資料先放入到:new表中,確認後放到要更新的表。

--:old表,將不要的資料先放入到:old表中,確認不要了再清除:old表。

--注意::new表和:old表中至始至終就只有一條資料,那請問有多少個列?觸發器的表有多少個列,:new表和:old表就有多少個列。

--案例:

sql>insert into emp values(…,張三,…,0,……);

sql>create or replace trigger trig_name

after insert --插入操作之後

on emp --在emp表中

for each row --行級模式

begin

if(:new.sal<=0) then --新錶:new中的sal等於0

dbms_output.put_line('警告:幹活不能不給薪水');

rollback;(可以用異常:拋異常後回滾資料)

else

dbms_output.put_line('已插入記錄');

commit;

end if;

end;

a. 觸發器語句(事件)--定義啟用觸發器的dml事件和ddl事件;

b. 觸發器限制 --執行觸發器的條件,該條件為真才能啟用觸發器;

c. 觸發器操作(主體)--包含sql語句和**,它們在發出了觸發語句且觸發限制的值為真是才執行。

注示:序列通過前觸發儲存到資料庫中。

案例:在級聯表中建立觸發器案例

--李斯文不能刪

(什麼時候觸發?a.delete時; b.when 條件滿足時; c.**中寫明)

sql>create or replace trigger t_studel

after delete --刪除操作之後

on stuinfo

for each row

begin

if :old.stuname='李斯文' then --如果:old表中存在李斯文,就提示不能刪

--丟擲異常

raise_application_error(-20010,'該學生不能刪!!!');

end if;

end;

sql>delete from emp;

--李斯文不能刪也不能改

只需修改上例**中的:

after delete or update

--怎麼知道是(insert\delete\update)哪個操作?不知道沒關係,用case when語句

begin

case

when deleting then

--刪除時

if :old.stuname='李斯文' then

raise_application_error(-20010,'該學生不能刪!!!');

end if;

when updating then

--修改時

if :old.stuname='李斯文' then

raise_application_error(-20011,'該學生不能修改!!!');

end if;

when inserting then

--插入時

if :new.stuname='張楊' then

raise_application_error(-20012,'該學生你也敢招!!!');

end if;

end case;

end;

在stuinfo表中寫個delete觸發器,指定刪除的人名,

直接刪除stumarks表中該人的成績。

create or replace tirgger t_mydel

after delete

on stuinfo

for each row

declare

stu varchar2(22);

begin

stu:=:old.stuno; --將刪除的學生的學號賦值給該變數

delete from stumarks where stuno=stu;

end;

--執行下

delete from stuinfo where stuname='李斯文';

標識列:序列+觸發器

--解決:

(1)建表

create table tb_715(

sid number,

sname varchar2(22)

(2)建立序列

create sequence seq715;

(3)建立個觸發器,用前觸發,用new表

create or replace trigger t_insert

before insert

on tb_715

for each row

begin

--新錶中的id=序列的下乙個值

:new.sid:=seq715.nextval;

end;

oracle 11g的語法:

:new.sid:=seq715.nextval;

oracle 10g的語法:

select seq715.nextval into :new.sid from dual;

別用變數,用變數的方法就是11g的寫法。

oracle觸發器分:前觸發、後觸發

觸發器郵件的概念以及運用

很多時候,我們都會接觸到觸發器郵件這個概念。那麼,究竟什麼是觸發器郵件呢?觸發器郵件有什麼運用呢?本文給大家介紹一下。觸發器郵件其實就是指當滿足乙個條件之後,郵件自動進行下一步操作的步驟和操作。比如說我給客戶傳送了一封郵件之後,客戶會根據自己的需求,選擇開啟郵件進行檢視內容,根據客戶開啟的不同鏈結,...

ORACLE觸發器 行級觸發器

行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸發器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例乙個簡單的...

Oracle的觸發器

每當乙個特定的數操作語句 insert,update,delete 在指定的表上發出時,oracle自動的執行觸發器中定義的語句序列。這個定義,大家看到就能明白觸發器的作用了,增刪改查,為什麼觸發器沒有查詢呢。因為oracle的觸發器是針對資料變動時所觸發的一種待定行動。比如你刪除了乙個表中的字段,...