AFTER觸發器與INSTEAD OF觸發器的區別

2021-05-24 11:22:30 字數 2617 閱讀 4666

instead of 觸發器用來代替通常的觸發動作,即當對錶進行insert、update 或 delete 操作時,系統不是直接對錶執行這些操作,而是把操作內容交給觸發器,讓觸發器檢查所進行的操作是否正確。如正確才進行相應的操作。因此,instead of 觸發器的動作要早於表的約束處理。

instead of 觸發器的操作有點類似於完整性約束。在對資料庫的操縱時,有些情況下使用約束可以達到更好的效果,而如果採用觸發器,則能定義比完整性約束更加複雜的約束。有關觸發器與約束的比較,請參見聯機叢書。

instead of 觸發器不僅可在表上定義,還可在帶有乙個或多個基表的檢視上定義,但在作為級聯引用完整性約束目標的表上限制應用。

after 觸發器定義了對錶執行了 insert、update 或 delete 語句操作之後再執行的操作。比如對某個表中的資料進行了更新操作後,要求立即對相關的表進行指定的操作,這時就可以採用 after 觸發器。after 觸發器只能在表上指定,且動作晚於約束處理。

每乙個表上只能建立乙個 instead of 觸發器,但可以建立多個 after 觸發器。

例項:instead of 觸發器:

向表「計0261」插入資料時,檢查學號是否存在於表「計026」中,如存在則進行插入操作,否則就不插入。

view plaincopy to clipboardprint?

create trigger [checkid] on [dbo].[計0261]   

instead of insert  

as  

if not exists(select * from 計026 where 學號=(select 學號 from inserted))  

begin  

rollback transaction  

print '要處理記錄的學號不存在!' 

end  

else  

begin  

insert into 計0261 select * from inserted  

print '已經成功處理記錄!' 

end 

create trigger [checkid] on [dbo].[計0261]

instead of insert

asif not exists(select * from 計026 where 學號=(select 學號 from inserted))

begin

rollback transaction

print '要處理記錄的學號不存在!'

endelse

begin

insert into 計0261 select * from inserted

print '已經成功處理記錄!'

endafter 觸發器:

對訂貨表設定 after(for) 型別的 insert 觸發器,用來在插入記錄時自動將統計值計算到訂貨統計表中。

view plaincopy to clipboardprint?

create trigger [orderinsert] on [dbo].[訂貨表]  

after insert  

as  

declare @bookid int, @ordernum int, @num int 

select @bookid = 書籍編號, @ordernum = 數量 from inserted  

select @num = count(書籍編號) from 訂貨統計表 where 書籍編號=@bookid

if @num = 0  

--未找到該書,插入記錄  

insert into 訂貨統計表 values(@bookid, @ordernum)  

else  

--找到該書,更新記錄  

update 訂貨統計表  

set 總訂貨量 = 總訂貨量 + @ordernum where 書籍編號 = @bookid 

create trigger [orderinsert] on [dbo].[訂貨表]

after insert

asdeclare @bookid int, @ordernum int, @num int

select @bookid = 書籍編號, @ordernum = 數量 from inserted

select @num = count(書籍編號) from 訂貨統計表 where 書籍編號=@bookid

if @num = 0

--未找到該書,插入記錄

insert into 訂貨統計表 values(@bookid, @ordernum)

else

--找到該書,更新記錄

update 訂貨統計表

set 總訂貨量 = 總訂貨量 + @ordernum where 書籍編號 = @bookid

如上所述,簡而言之:

after觸發器是在操作成功後,所採取的一些動作

而對於instead of觸發器,對資料庫的操作只是乙個「導火線」而已,真正起作用的是觸發器裡面的動作;

往往這種觸發器會有很多分支判斷語句在裡面,根據不用的條件做不同的動作

觸發器能處理更複雜的約束--簡單的可用級聯及簡單約束來實現

AFTER觸發器與INSTEAD OF觸發器的區別

全文 instead of 觸發器用來代替通常的觸發動作,即當對錶進行insert update 或 delete 操作時,系統不是直接對錶執行這些操作,而是把操作內容交給觸發器,讓觸發器檢查所進行的操作是否正確。如正確才進行相應的操作。因此,instead of 觸發器的動作要早於表的約束處理。i...

觸發器中Before與After區別

基本概念 after 是先完成資料的增刪改,然後再觸發,觸發的語句晚於監視的增刪改,無法影響前面的增刪改動作 也就是說先插入訂單記錄,再更新商品數量。當商品數量少於訂單數量時造成爆庫。before 先完成觸發,在進行增刪改,觸發語句先於監視的增刪改,我們就有機會判斷,修改即將發生的操作。如 我們在觸...

oracle中觸發器中的after和before

1 oracle中觸發器中的after和before有什麼區別 乙個是在記錄操作之前觸發,乙個是在記錄操作之後觸發。2 分別用在什麼場合 比如表之間定義的有外來鍵,在刪除主鍵時,必須要先刪除外來鍵表,這時就有先後之分。3 還有語句級觸發和行級觸發有什麼區別?如果定義為語句級,則delete from...