一,觸發器的定義
觸發器是一種特殊類型的存儲過程,主要是通過事件進行觸發而被執行。當對錶進行UPDATE、 INSERT、 DELETE 這些操作時,數據庫會自動執行被定義的語句。
二,觸發器與存儲過程的區別
存儲過程必須要有用戶、應用程序或者觸發器來顯示的調用並執行,可以通過存儲過程的名字直接被調用,類似於表的操作。而觸發器則必須要滿足特定的條件,才能通過事件被自動觸發。
三,觸發器的作用
觸發器的主要作用就是能強化約束關係從而保證數據完整性和一致性。其次還有一些功能,例如:
1)跟蹤數據庫內的操作,從而不允許數據庫中未經許可的指定更新和變化;
2)檢測數據庫內的操作,自動級聯影響整個數據庫的數據。例如,Table_A表上的觸發器中有對Table_B表的數據的(INSERT,DELETE,UPDATE)操作,而此操作又導致該表上觸發器被觸發。
自動增加數據:
--當我在Table_A表插入一條數據時,觸發一個事件
--這個事件,將會自動在Table_B表,將該書籍對應的類別庫存數+1
go
create trigger tri_add --新建一個觸發器
on Books for insert --當執行insert(增加)時
as
--修改分類表的庫存
declare @TypeiD int
select @TypeiD=TypeID from inserted
update BookType set nums=Nums+1 where ID=@TypeiD
insert Books values('建築測量','測得很準',3) --執行操作
修改
--修改mvc的分類(typeID)改爲1時,觸發事件
--這個事件觸發後,將自動在分類表裏,對應的ID=2庫存-1,ID=1的庫存+1
go
create trigger tri_update
on Books for update
as
--修改分類表的庫存
declare @oldTypeiD int
declare @newTypeiD int
select @oldTypeiD=TypeID from deleted
update BookType set nums=Nums-1 where ID=@oldTypeiD --在deleted表中刪除數據
select @newTypeiD=TypeID from inserted
update BookType set nums=Nums+1 where ID=@newTypeiD --在inserted表中增加數據
--執行修改操作
update Books set TypeID=1 where Name='mvc'
Table_A表
Table_B表
說明:inserted表和deleted表用於存放對錶中數據行的修改信息,他們是觸發器執行時自動創建的,是臨時表。當觸發器工作完成,它們也被刪除。只讀表,不能向它們寫入內容。
inserted表:用來存儲INSERT和UPDATE語句所影響的行的副本
deleted表:用來存儲DELETE和UPDATE語句所影響行的副本
四,觸發器的分類
SQL Server支持兩種類型的觸發器:AFTER 觸發器和INSTEAD OF 觸發器。
1)AFTER 觸發器
在語句執行後觸發,不論此語句影響了多少行數據(包括0行),都只觸發一次。如果原語句因爲違反約束而未生效,觸發器將不被觸發。
2)INSTEAD OF 觸發器
不執行語句的操作(INSERT、 UPDATE、 DELETE),而是執行這個觸發器。既可在表上定義INSTEAD OF 觸發器,也可以在視圖上定義INSTEAD OF 觸發器,但對同一操作只能定義一個INSTEAD OF 觸發器。