前言
前面關(guān)系數(shù)據(jù)庫(kù)SQL之可編程性函數(shù)(用戶(hù)自定義函數(shù))一文提到關(guān)系型數(shù)據(jù)庫(kù)提供了可編程性的函數(shù)鹏溯、存儲(chǔ)過(guò)程、事務(wù)淹仑、觸發(fā)器及游標(biāo)丙挽,前文已介紹了函數(shù)、存儲(chǔ)過(guò)程匀借、事務(wù)取试,本文來(lái)介紹一下觸發(fā)器的使用。(還是以前面的銀行系統(tǒng)為例)
概述
觸發(fā)器(TRIGGER)是個(gè)特殊的存儲(chǔ)過(guò)程怀吻,它的執(zhí)行不是由程序調(diào)用瞬浓,也不是手工啟動(dòng),而是由事件來(lái)觸發(fā)蓬坡,比如當(dāng)對(duì)一個(gè)表進(jìn)行操作( INSERT猿棉,DELETE磅叛, UPDATE)時(shí)就會(huì)激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等萨赁。 觸發(fā)器可以從 DBA_TRIGGERS 弊琴,USER_TRIGGERS 數(shù)據(jù)字典中查到。
觸發(fā)器分為兩種:AFTER觸發(fā)器和INSTEAD OF觸發(fā)器杖爽。
語(yǔ)法
- 創(chuàng)建觸發(fā)器
CREATE TRIGGER <觸發(fā)器名稱(chēng)>
ON <表名|視圖名>
[AFTER | INSTEAD OF] <INSERT,DELETE,UPDATE>
AS
--SQL語(yǔ)句塊
- 修改觸發(fā)器
ALERT TRIGGER <觸發(fā)器名稱(chēng)>
ON <表名|視圖名>
[AFTER | INSTEAD OF] <INSERT,DELETE,UPDATE>
AS
--SQL語(yǔ)句塊
- 刪除觸發(fā)器
DROP TRIGGER <觸發(fā)器名稱(chēng)>
說(shuō)明:
- AFTER觸發(fā)器主要用于在數(shù)據(jù)表執(zhí)行INSERT敲董,DELETE, UPDATE操作之后慰安,同時(shí)操作其他表腋寨。
- INSTEAD OF觸發(fā)器會(huì)替代所要執(zhí)行的SQL語(yǔ)句,也就是說(shuō)所要執(zhí)行SQL并不會(huì)真正執(zhí)行化焕,真正執(zhí)行的是觸發(fā)器中定義的操作萄窜。
- AFTER觸發(fā)器只針對(duì)表操作,INSTEAD OF觸發(fā)器除了操作表還可以作用于視圖撒桨,擴(kuò)展視圖可以支持的更新操作查刻。
- AFTER觸發(fā)器是在執(zhí)行SQL之后觸發(fā),而INSTEAD OF觸發(fā)器是在執(zhí)行SQL之前觸發(fā)凤类。
- 一個(gè)表的INSERT穗泵,DELETE, UPDATE操作可以有多個(gè)AFTER觸發(fā)器谜疤,有至多一個(gè)INSTEAD OF觸發(fā)器佃延。
特殊表
觸發(fā)器有兩個(gè)特殊的表:插入表(instered表)和刪除表(deleted表)
示例
1.AFTER觸發(fā)器示例
在取錢(qián)時(shí),交易信息表里面插入交易信息茎截,同時(shí)要更改賬戶(hù)表里面的余額
--創(chuàng)建觸發(fā)器
CREATE TRIGGER Trigger_getMoney
ON TransInfo
AFTER INSERT
AS
declare @cardId varchar(19)
declare @tranMoney money
select @cardId = CardID , @tranMoney = TransMoney from instered;
update CardInfo set LeftMoney = LeftMoney - @tranMoney where CardID = @cardId
GO
--執(zhí)行插入操作
insert into TransInfo values('1324 3626 7532 1935','取款',500,default);
2.INSTEAD OF觸發(fā)器
指定的賬戶(hù)"422322001550135015"不可以刪除
--創(chuàng)建觸發(fā)器
CREATE TRIGGER Trigger_deleteAccount
ON AccountInfo
INSTEAD OF DELETE
AS
delete from AccountInfo where CardID != '422322001550135015' AND CardID=(select CardID from deleted)
--執(zhí)行刪除操作
本文就介紹到這里苇侵。
如有疑問(wèn)請(qǐng)聯(lián)系我赶盔。
本文采用知識(shí)共享署名-相同方式共享 4.0 國(guó)際許可協(xié)議進(jìn)行許可企锌。
基于簡(jiǎn)書(shū)上的作品創(chuàng)作。 可轉(zhuǎn)載于未、引用撕攒,但需經(jīng)本人同意后署名作者且注明文章出處,并以相同方式共享烘浦。
知識(shí)共享許可協(xié)議