1. 概述
觸發器是一種特殊的存儲過程,它不能被顯式地調用,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活。 所以觸發器可以用來實現對表實施復雜的完整性約束。
2. 觸發器的分類
SQL Server2000提供了兩種觸發器:“Instead of” 和“After” 觸發器。
一個表或視圖的每一個修改動作(Insert、Update和Delete)都可以有一個“Instead of” 觸發器,一個表的每個修改動作都可以有多個“After”觸發器。
2.1 “Instead of”觸發器
alter trigger trigger_學生_Delete on 學生 instead of Delete as begin select 學號, 姓名 from deleted end delete from 學生 where 學號 = 4
上例中定義了“trigger學生_Delete”觸發器,該觸發器從“delete”表中打印出所要刪除的學生.在執行“delete”操作後,會發現“學號 = 4”的學生並未被刪除, 原因在於“trigger學生Delete”替代了所要執行的“delete from 學生 where 學號 = 4”語句,而在“trigger學生_Delete”中並未真正刪除學生。
2.2 “After”觸發器
3. Inserted和Deleted表
SQL Server為每個觸發器都創建了兩個專用表:Inserted表和Deleted表。
4. 觸發器的執行過程
5. 創建觸發器
create trigger trigger_name on {table_name|view_name} {After|Instead of} {insert|update|delete} as 相應T-SQL語句
6. 修改觸發器:
alter trigger trigger_name on {table_name|view_name} {After|Instead of} {insert|update|delete} as 相應T-SQL語句
7. 刪除觸發器:
drop trigger trigger_name
8. 查看數據庫中已有觸發器:
8.1 查看數據庫中所有觸發器
select * from sysobjects where xtype='TR'
8.2 查看單個觸發器
exec sp_helptext '觸發器名'
9. “Instead of”相關示例:
兩張表:學生(學號 int, 姓名 varchar)、借書記錄(學號 int, 圖書編號 int)
實現功能:在刪除學生表時,如果該學生仍有借書記錄(未還)則不能刪除
alter trigger trigger_學生_Delete on 學生 instead of Delete as begin if not exists(select * from 借書記錄, deleted where 借書記錄.學號 = deleted.學號) delete from 學生 where 學生.學號 in (select 學號 from deleted) end
10. “After”觸發器
10.1 在“訂單”表中建立觸發器,當向“訂單”表中插入一條訂單記錄時,檢查“商品”表的貨品狀態“狀態”是否為1(正在整理),則不能往“訂單”表加入該訂單。
create trigger trigger_訂單_insert on 訂單 after insert as if (select 狀態 from 商品, inserted where 商品.pid = inserted.pid)=1 begin print 'the goods is being processed' print 'the order cannot be committed' rollback transaction --回滾,避免加入 end
10.2 在“訂單”表建立一個插入觸發器,在添加一條訂單時,減少“商品”表相應的貨品記錄中的庫存。
create trigger trigger_訂單_insert2 on 訂單 after insert as update 商品 set 數量 = 數量 - inserted.數量 from 商品, inserted where 商品.pid = inserted.pid
10.3 在“商品”表建立刪除觸發器,實現“商品”表和“訂單”表的級聯刪除。
create trigger goodsdelete trigger_商品_delete on 商品 after delete as delete from 訂單 where 訂單.pid in (select pid from deleted)
10.4 在“訂單”表建立一個更新觸發器,監視“訂單”表的“訂單日期”列,使其不能被“update”.
create trigger trigger_訂單_update on 訂單 after update as if update(訂單日期) begin raiserror('訂單日期不能手動修改',10,1) rollback transaction end
10.5 在“訂單”表建立一個插入觸發器,保證向“訂單”表插入的貨品必須要在“商品”表中一定存在。
create trigger trigger_訂單_insert3 on 訂單 after insert as if (select count(*) from 商品, inserted where 商品.pid = inserted.pid)=0 begin print '商品不存在' rollback transaction end
10.6 “訂單”表建立一個插入觸發器,保證向“訂單”表插入的貨品信息要在“訂單日志”表中添加
alter trigger trigger_訂單_insert on 訂單 for insert as insert into 訂單日志 select inserted.Id, inserted.pid,inserted.數量 from inserted
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。