前觸發器和後觸發器簡介

2021-04-06 16:31:35 字數 3715 閱讀 5390

觸發器是一種特殊的儲存過程。當

insert update

或者delete

語句修改表中乙個或者多個行時執行觸發器。因為

sql server

對特定表上的每乙個指定操作呼叫乙個觸發器,所以可以使用觸發器擴充套件

sql sever

的內建完整性和資料操縱功能.

注意:

不像delete

語句,trancate table

語句不啟用觸發器,

write text

語句也不啟用觸發器。

在sql sever 2000

中支援兩種型別的觸發器,前觸發器

(instead of trigger)

和後觸發器

(after trigger)

。前觸發器就是在語句執行之前啟用觸發器,而後觸發器就是在語句執行之後啟用觸發器。可以通過

for

子句來選擇使用何種觸發器。

當為每一種操作建立乙個觸發器時,可以為所有三種操作建立乙個觸發器,並且使用相應的程式設計技術處理每一種操作。下面的示例在

for

子句中列出了三種語句型別並,且使用條件語句將相應的跟蹤值插入到

custupdlog

表中。create trigger trackcustomerupdates

for insert,update,delete

asdeclare @insertedcount int

declare @deletedcount int

set @insertedcount=(select count(*)from inserted)

set @deletedcount=(select count(*)from deleted)

if ( @insertedcount>0)begin

( custid,

action,

upduser,

upddatetime)

select custid,

case

when( @deletedcount>0)then

'update'

else 'insert'

end,

current_user,

current_timestamp

from inserted

endelse if(@deletedcount>0)begin

( custid,

action,

upduser,

upddatetime)

select custid,

'delete',

current_user,

current_timestamp

from deleted

end正如本例所示,無論何時

insert

或者update

語句影響乙個或者多行時,

inserted

臨時表都有記錄行。無論何時

delete

或者update

語句影響乙個或者多行時,

deleted

臨時表都有記錄行。對於乙個

update

語句,deleted

臨時表有舊行,

inserted

臨時表有新行。這個示例還反映了觸發器的另乙個重要方面:對於某個表的

update

或者delete

操作,即使該語句沒有影響到行,也啟用觸發器

(也就是說沒有滿足

where

子句的行)。

觸發器的儲存過程應該**這種可能性。

不僅可以為乙個表建立多個觸發器,而且還可以為乙個表的同乙個

sql 語句(

例如update 語句)

建立多個後觸發器,不能為同乙個

sql

語句建立多個前觸發器。每乙個新的

create trigger

語句增加觸發器到那些指定表和語句已有的觸發器中。對於所建立的多個觸發器,可以用系統儲存過程

sp_settriggerorder

來指定第乙個被啟用的觸發器和最後乙個被啟用的觸發器,而對於其他的觸發器,則不能指定其啟用順序,只能由系統決定。這種觸發器的特徵不會引起任何特殊的問題。因為總是可以實現各種動作作為正常的儲存過程,並且按照要求的順序從乙個觸發器中呼叫它們。

儘管觸發器是一種儲存過程,但是不能使用

execute

語句呼叫它,如果有希望共享觸發器和正常的儲存過程的編碼,那麼只需把共享**放在儲存過程中,從觸發器中呼叫它。如果乙個觸發器修改乙個表,那麼這些修改可能會啟用另乙個觸發器,或者本身。在預設情況下,

sql sever

允許這種巢狀的觸發器呼叫深度為

32層。雖然我們建議允許巢狀的和疊代的觸發器,但是可以使用系統儲存過程禁止這麼做。下面的語句在指定的資料庫上防止疊代觸發器:

為了在所有資料庫中防止巢狀觸發器呼叫

(包括疊代呼叫

),可以使用下面的語句:

sp_configure `nested triggers',0

前面以後觸發器為例介紹了觸發器的基本內容,下面再介紹一下前觸發器的不同之處。要建立乙個前觸發器必須用

instead of

顯式宣告,如下面的例子:

create trigger trackcustomerupdates

instead of update

as(custid,

action,

upduser,

upddatetime)

select custid,

『update』,

current_user,

current_timestamp

from inserted

與後觸發器不同的是:前觸發器既可以在表又可以在檢視上建立,但一條語句只能建立乙個前觸發器,因此,前觸發器不存在啟用順序問題

觸發器應用舉例:從當前資料庫伺服器的

shop

表insert

操作同步到另一台伺服器的

shop。

create trigger trigger_synshopforinsert1

on dbo.shop

for insert

asinsert into otherserver.dbo.shop (

lngshopid,strshopcode,strname,strshopname,strdescription,lngindex

)selectlngshopid,strshopcode,strname,strshopname,strdescription,lngindex

from shop where lngshopid in (select lngshopid from inserted)

或者:

create trigger trigger_synshopforinsert2

on dbo.shop

for insert

asinsert into otherserver.dbo.shop (

lngshopid,strshopcode,strname,strshopname,strdescription,lngindex

)selectlngshopid,strshopcode,strname,strshopname,strdescription,lngindex

frominserted

前觸發器和後觸發器簡介 downmoon

前觸發器和後觸發器簡介 觸發器是一種特殊的儲存過程。當insert update 或者delete 語句修改表中乙個或者多個行時執行觸發器。因為sql server 對特定表上的每乙個指定操作呼叫乙個觸發器,所以可以使用觸發器擴充套件sql sever 的內建完整性和資料操縱功能.注意 不像dele...

前觸發器和後觸發器簡介 downmoon

前觸發器和後觸發器簡介 downmoon 觸發器是一種特殊的儲存過程。當insert update 或者delete 語句修改表中乙個或者多個行時執行觸發器。因為sql server 對特定表上的每乙個指定操作呼叫乙個觸發器,所以可以使用觸發器擴充套件sql sever 的內建完整性和資料操縱功能....

觸發器簡介

觸發器 trigger 是個特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,不能帶引數,比如當對乙個表進行操作 insert,delete,update 時就會啟用它執行。觸發器經常用於加強資料的完整性約束和業務規則等。觸發器可以從 dba triggers user tr...