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