前言 前面[關係資料庫SQL之可編程性函數(用戶自定義函數)][1]一文提到關係型資料庫提供了可編程性的函數、存儲過程、事務、觸發器及游標,前文已介紹了函數、存儲過程、事務,本文來介紹一下觸發器的使用。( 還是以前面的銀行系統為例 ) ![圖片來自網路][0] 概述 觸發器(TRIGGER)是個特殊 ...
前言
前面關係資料庫SQL之可編程性函數(用戶自定義函數)一文提到關係型資料庫提供了可編程性的函數、存儲過程、事務、觸發器及游標,前文已介紹了函數、存儲過程、事務,本文來介紹一下觸發器的使用。(還是以前面的銀行系統為例)
概述
觸發器(TRIGGER)是個特殊的存儲過程,它的執行不是由程式調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( INSERT,DELETE, UPDATE)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。
觸發器分為兩種:AFTER觸發器和INSTEAD OF觸發器。
語法
創建觸發器
CREATE TRIGGER <觸發器名稱> ON <表名|視圖名> [AFTER | INSTEAD OF] <INSERT,DELETE,UPDATE> AS --SQL語句塊
修改觸發器
ALERT TRIGGER <觸發器名稱> ON <表名|視圖名> [AFTER | INSTEAD OF] <INSERT,DELETE,UPDATE> AS --SQL語句塊
刪除觸發器
DROP TRIGGER <觸發器名稱>
說明:
- AFTER觸發器主要用於在數據表執行INSERT,DELETE, UPDATE操作之後,同時操作其他表。
- INSTEAD OF觸發器會替代所要執行的SQL語句,也就是說所要執行SQL並不會真正執行,真正執行的是觸發器中定義的操作。
- AFTER觸發器只針對錶操作,INSTEAD OF觸發器除了操作表還可以作用於視圖,擴展視圖可以支持的更新操作。
- AFTER觸發器是在執行SQL之後觸發,而INSTEAD OF觸發器是在執行SQL之前觸發。
- 一個表的INSERT,DELETE, UPDATE操作可以有多個AFTER觸發器,有至多一個INSTEAD OF觸發器。
特殊表
觸發器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)
示例
1.AFTER觸發器示例
在取錢時,交易信息表裡面插入交易信息,同時要更改賬戶表裡面的餘額
--創建觸發器
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
--執行插入操作
insert into TransInfo values('1324 3626 7532 1935','取款',500,default);
2.INSTEAD OF觸發器
指定的賬戶"422322001550135015"不可以刪除
--創建觸發器
CREATE TRIGGER Trigger_deleteAccount
ON AccountInfo
INSTEAD OF DELETE
AS
delete from AccountInfo where CardID != '422322001550135015' AND CardID=(select CardID from deleted)
--執行刪除操作
本文就介紹到這裡。
如有疑問請聯繫我。
原文來自:簡書