觸發器是一種特殊的預存程序,與表格緊密相連。當使用者修改表中的資料時,觸發器將自動執行,觸發器可以使用Transact-SQL語句進行複雜的邏輯處理,它基於一個表建立,但是可以對多個表進行操作,因此常常用於複雜的商務規則。建立觸發器的文法如下:
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
建立觸發器文法中各參數的說明如表所示。
表 建立觸發器文法中的參數列表
參數 說明
trigger_name
觸發器的名稱。觸發器名稱必須符合標識符規則,並且在資料庫中必須惟一。可以選擇是否指定觸發器所有者名稱
Table | view
在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。可以選擇是否指定表或視圖的所有者名稱
WITH ENCRYPTION
加密syscomments表中包含CREATE TRIGGER語句文本的條目。使用WITH ENCRYPTION可防止將觸發器作為SQL Server複製的一部分發布
AFTER
指定觸發器只有在觸發SQL語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器
INSTEAD OF
指定執行觸發器而不是執行觸發SQL語句,從而替代觸發語句的操作。
在表或視圖上,每個INSERT、UPDATE或DELETE語句最多可以定義一個INSTEAD OF觸發器。然而,可以在每個具有INSTEAD OF觸發器的視圖上定義視圖。
INSTEAD OF觸發器不能在WITH CHECK OPTION的可更新視圖上定義。如果向指定了WITH CHECK OPTION選項的可更新視圖添加INSTEAD OF觸發器,SQL Server將產生一個錯誤。使用者必須用ALTER VIEW刪除該選項後才能定義INSTEAD OF觸發器
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
指定在表或視圖上執行哪些資料修改語句時將啟用觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項
對於INSTEAD OF觸發器,不允許在具有ON DELETE級聯操作參考關聯性的表上使用DELETE選項。同樣,也不允許在具有ON UPDATE級聯操作參考關聯性的表上使用UPDATE選項
WITH APPEND
指定應該添加現有類型的其他觸發器。只有當相容層級是65或更低時,才需要使用該可選子句。如果相容層級是70或更高,則不必使用WITH APPEND子句添加現有類型的其他觸發器
NOT FOR REPLICATION
表示當複製進程更改觸發器所涉及的表時,不應執行該觸發器
AS
觸發器要執行的操作
sql_statement
觸發器的條件和操作。觸發器條件指定其他準則,以確定DELETE、INSERT 或UPDATE語句是否導致執行觸發器操作。
當嘗試DELETE、INSERT或UPDATE操作時,Transact-SQL語句中指定的觸發器操作將生效
指定觸發器何時觸發分為以下兩種情況:
AFTER觸發器在觸發操作(INSERT、UPDATE或DELETE)後和處理完任何約束後觸發。可通過指定AFTER或FOR關鍵字來請求 AFTER 觸發器。因為FOR關鍵字與AFTER的效果相同,所以具有FOR關鍵字的觸發器也歸類為AFTER觸發器。
INSTEAD OF觸發器代替觸發動作進行觸發,並在處理約束之前觸發。對於每個觸發操作(UPDATE、DELETE和INSERT),每個表或視圖只能有一個INSTEAD OF觸發器。而一個表對於每個觸發操作可以有多個AFTER觸發器。
樣本 觸發器的建立與應用
本樣本實現的是,當對班級表進行刪除操作時,其學生表中屬於被刪除班的學生資訊自動刪除。
程式碼如下:
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'Trig_Del'
AND type = 'TR')
DROP TRIGGER Trig_Del
GO
CREATE TRIGGER Trig_Del
ON t_TClass
FOR DELETE
AS
BEGIN
declare @ID varchar(10)
select @ID=t_trigClss from deleted
delete from t_TStu where t_trigClass=@ID
END