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