觸發器是當發生某個事件后自動的調用執行的特殊存儲過程。
Sql server中的3類觸發器
Insert:向數據表插入數據時,調用insert觸發器。
Update:更新數據時調用update觸發器。
Delete:刪除數據時執行Delete觸發器。
Sql server中這三類觸發器總是在執行操作語句后才被自動調用。
三個虛擬表
Inserted表在執行插入語句時臨時緩存數據值,通過觸發器的判斷之后才正式插入成功。
Updated表在更新數據是臨時緩存數據值,功能同上。
Deleted表在刪除數據是臨時緩存數據值,功能同上。
Sql server中創建和使用觸發器語法
Create trigger trigger_name----創建名稱
On {table|view}----定義在表或者視圖上
[with encryption]----加密元數據
{
{ {for|after|instead of}{[insert][,][update][,][delete]}觸發器執行的條件
[with append]
[ont for replication]
As----觸發器要執行的操作
[ {if update(column)----判斷執行的是什么操作
[{and|or}update(column)][,…n]
|if(columns_updated(){bitwise_operator}updated_bitmask)----判斷是否插入跟新了數據
{comparison_operator}column[,…n]
}]
Sql_statement[,…n]操作語句
}
}
for|after|instead of:for用於執行SQL語句時觸發,after用於執行所有SQL語句后觸發,instead of用於執行SQL語句前觸發,替代執行SQL語句。
columns_updated():用以和后面updated_bitmask參數指定的字段進行位操作判斷數據的插入和更新。
bitwise_operator:位操作符&,第1個字段為1,第2個字段為10,第2、3個字段為110,一次類推。
有以上語法可以看出觸發器是基於表或者視圖的,和存儲過程的區別是:存儲過程不依賴表或者視圖,表的刪除對存儲過程不影響,而觸發器會隨着表或者視圖的刪除被刪除。
使用insert觸發器
舉例:在向score表插入數據時,要求‘學號’字段必須在student表中存在,‘課號’必須在course表中存在。
create trigger trigger_insert
on score
for insert
as
declare @xuehao int,@kehao int
select @xuehao=學號,@kehao=課號
from inserted
if @xuehao not in(select 學號 from student)
begin
rollback transaction
print'學生表中不存在的學號,取消插入數據'
end
if @kehao not in(select 課號 from course)
begin
rollback transaction
print'成績表中不存在的課號,取消插入數據'
end