更改原來由 CREATE TRIGGER 語句創(chuàng)建的觸發(fā)器定義。有關(guān) ALTER TRIGGER 語句所用參數(shù)的更多信息,請參見 CREATE TRIGGER。
ALTER TRIGGER trigger_name
ON ( table | view )
[ WITH ENCRYPTION ]
{
{ ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
[ NOT FOR REPLICATION ]
AS
sql_statement [ ...n ]
}
{
|
( FOR | AFTER | INSTEAD OF ) { [ INSERT ] [ , ] [ UPDATE ] }
[ 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
是要更改的現(xiàn)有觸發(fā)器。
table | view
是觸發(fā)器在其上執(zhí)行的表或視圖。
WITH ENCRYPTION
加密 syscomments 表中包含 ALTER TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發(fā)器作為 SQL Server 復(fù)制的一部分發(fā)布。
說明 如果原來的觸發(fā)器定義是用 WITH ENCRYPTION 或 RECOMPILE 創(chuàng)建的,那么只有在 ALTER TRIGGER 中也包含這些選項時,這些選項才有效。
AFTER
指定觸發(fā)器只有在觸發(fā)它的 SQL 語句執(zhí)行成功后才觸發(fā)。所有的引用級聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。
如果僅指定了 FOR 關(guān)鍵字,那么 AFTER 是默認設(shè)置。
AFTER 觸發(fā)器只能定義在表上。
INSTEAD OF
指定執(zhí)行觸發(fā)器而不是觸發(fā) SQL 語句,從而替代觸發(fā)語句的操作。
在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發(fā)器。然而,可以在每個具有 INSTEAD OF 觸發(fā)器的視圖上定義視圖。
INSTEAD OF 觸發(fā)器不允許定義在用 WITH CHECK OPTION 創(chuàng)建的視圖上。如果向指定了 WITH CHECK OPTION 選項的視圖添加 INSTEAD OF 觸發(fā)器,SQL Server 將引發(fā)一個錯誤。用戶必須用 ALTER VIEW 刪除該選項后才能定義 INSTEAD OF 觸發(fā)器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] } | { [INSERT] [,] [UPDATE]}
是指定在表或視圖上執(zhí)行哪些數(shù)據(jù)修改語句時將激活觸發(fā)器的關(guān)鍵字。必須至少指定一個選項。在觸發(fā)器定義中允許使用以任意順序組合的這些關(guān)鍵字。如果指定的選項多于一個,需用逗號分隔這些選項。
對于 INSTEAD OF 觸發(fā)器,不允許在具有 ON DELETE 級聯(lián)操作引用關(guān)系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯(lián)操作引用關(guān)系的表上使用 UPDATE 選項。有關(guān)更多信息,請參見 ALTER TABLE。
NOT FOR REPLICATION
表示當復(fù)制登錄(如 sqlrepl)更改觸發(fā)器所涉及的表時,不應(yīng)執(zhí)行該觸發(fā)器。
AS
是觸發(fā)器要執(zhí)行的操作。
sql_statement
是觸發(fā)器的條件和操作。
n
是表示觸發(fā)器中可以包含多條 Transact-SQL 語句的占位符。
IF UPDATE (column)
測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。
可以在觸發(fā)器主體中的任意位置使用 UPDATE(column)。
{AND | OR}
指定要測試 INSERT 或 UPDATE 操作的另一個列。
column
是要測試 INSERT 或 UPDATE 操作的列名。
IF (COLUMNS_UPDATED())
判斷提及的一列或多列是插入還是更新,僅用于 INTSERT 或 UPDATE 觸發(fā)器中。COLUMNS_UPDATED 返回 varbinary 位模式,該位模式表示表的哪些列進行了插入操作,哪些列進行了更新操作。
可以在觸發(fā)器主體中的任意位置使用 COLUMNS_UPDATED。
bitwise_operator
是用于比較運算的位運算符。
updated_bitmask
是整型位掩碼,表示實際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發(fā)器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。
comparison_operator
是比較運算符。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實際進行了更新。使用大于號 (>) 來檢查 updated_bitmask 中指定的列是否有進行過更新的,或者沒有全部進行更新。
column_bitmask
是要檢查的列的整型位掩碼。
有關(guān) ALTER TRIGGER 的更多信息,請參見 CREATE TRIGGER 中的注釋。
說明 由于 Microsoft 不支持在系統(tǒng)表上添加用戶定義觸發(fā)器,所以建議不要在系統(tǒng)表上創(chuàng)建用戶定義觸發(fā)器。
通過表和視圖上的 INSTEAD OF 觸發(fā)器,ALTER TRIGGER 支持可手工更新的視圖。Microsoft® SQL Server™ 以相同的方式對所有類型的觸發(fā)器(AFTER、INSTEAD-OF)應(yīng)用 ALTER TRIGGER。
可用 sp_settriggerorder 指定表上第一個和最后一個執(zhí)行的 AFTER 觸發(fā)器。在表上只能指定一個第一個執(zhí)行及一個最后一個執(zhí)行的 AFTER 觸發(fā)器。如果該表上還有其它 AFTER 觸發(fā)器,那么這些觸發(fā)器將以未定義的順序執(zhí)行。
如果 ALTER TRIGGER 語句更改了第一個或最后一個觸發(fā)器,則將除去已修改觸發(fā)器上設(shè)置的第一個或最后一個特性,而且必須用 sp_settriggerorder 重置排序值。
只有當激發(fā)觸發(fā)器的 SQL 語句(包括所有與被更新或刪除對象有關(guān)的引用級聯(lián)操作和約束檢查)成功執(zhí)行后,AFTER 觸發(fā)器才會執(zhí)行。AFTER 觸發(fā)器操作要檢查激發(fā)觸發(fā)器的語句的運行結(jié)果(也包括所有由激發(fā)語句引起的 UPDATE 和 DELETE 引用級聯(lián)操作)。
如果一個子表或引用表上的 DELETE 操作是由于父表的 CASCADE DELETE 操作所引起的,并且子表上定義了 DELETE 的 INSTEAD OF 觸發(fā)器,那么將忽略該觸發(fā)器并執(zhí)行 DELETE 操作。
ALTER TRIGGER 的權(quán)限默認地授予 db_owner 和 db_ddladmin 固定數(shù)據(jù)庫角色的成員,以及表所有者。這些權(quán)限是不可傳遞的。
下例首先創(chuàng)建一個觸發(fā)器,當用戶在表 roysched 中添加或更改數(shù)據(jù)時,該觸發(fā)器向客戶端打印一條用戶定義消息。然后,使用 ALTER TRIGGER 語句使該觸發(fā)器僅對 INSERT 活動有效。該觸發(fā)器有助于提醒向表中插入行或更新行的用戶及時通知書的作者和出版商。
USE pubs
GO
CREATE TRIGGER royalty_reminder
ON roysched
WITH ENCRYPTION
FOR INSERT, UPDATE
AS RAISERROR (50009, 16, 10)
-- Now, alter the trigger.
USE pubs
GO
ALTER TRIGGER royalty_reminder
ON roysched
FOR INSERT
AS RAISERROR (50009, 16, 10)
消息 50009 是 sysmessages 中的用戶定義消息。有關(guān)創(chuàng)建用戶定義消息的更多信息,請參見 sp_addmessage。
相關(guān)文章