前觸發器和後觸發器簡介
觸發器是一種特殊的儲存過程。當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...