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

2021-04-06 15:22:03 字數 3307 閱讀 3804

前觸發器和後觸發器簡介

觸發器是一種特殊的儲存過程。當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

onfor

insert

,update

,delete

asdeclare

@insertedcount

intdeclare

@deletedcount

intset

@insertedcount=(

select

count(*

)from

inserted)

set@deletedcount=(

select

count(*

)from

deleted)

if( 

@insertedcount

>0)

begin

insert

into

select

custid,

case

when

( @deletedcount

>0)

then

'update

'else

'insert

'end

,current_user

,current_timestamp

from

inserted

endelseif(

@deletedcount

>0)

begin

insert

into

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

create

trigger

trackcustomerupdates

onof

update

asinsert

into

select

custid,

『update

』,current_user

,current_timestamp

from

inserted

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

觸發器應用舉例:從當前資料庫伺服器的shop表insert操作同步到另一台伺服器的shop。

create

trigger

trigger_synshopforinsert1

ondbo.shop

forinsert

asinsert

into

otherserver.dbo.shop

(lngshopid,strshopcode,strname,strshopname,strdescription,lngindex

)select

lngshopid,strshopcode,strname,strshopname,strdescription,lngindex

from

shop 

where

lngshopid in(

select

lngshopid 

from

inserted)

或者:create

trigger

trigger_synshopforinsert2

ondbo.shop

forinsert

asinsert

into

otherserver.dbo.shop

(lngshopid,strshopcode,strname,strshopname,strdescription,lngindex

)select

lngshopid,strshopcode,strname,strshopname,strdescription,lngindex

from

inserted

助人等於自助!   [email protected]

前觸發器和後觸發器簡介

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

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

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

觸發器簡介

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