sql server 2005 T-SQL ALTER TRIGGER (Transact-SQL)

修改 CREATE TRIGGER 語句以前創建的 DML、DDL 或登錄觸發器的定義。觸發器是通過使用 CREATE TRIGGER 創建的。這些觸發器可以由 Transact-SQL 語句直接創建,也可以由程序集方法創建,這些方法在 Microsoft .NET Framework 公共語言運行時 (CLR) 中創建並上載到 SQL Server 的實例。有關 ALTER TRIGGER 語句所使用參數的詳細信息,請參閱 CREATE TRIGGER (Transact-SQL)

主題鏈接圖標Transact-SQL 語法約定

 Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) ALTER TRIGGER schema_name.trigger_name  ON ( table | view )  [ WITH <dml_trigger_option> [ ,...n ] ] ( FOR | AFTER | INSTEAD OF )  { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }  [ NOT FOR REPLICATION ]  AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME <method specifier> [ ; ] }   <dml_trigger_option> ::=     [ ENCRYPTION ]     [ <EXECUTE AS Clause> ]  <method_specifier> ::=         assembly_name.class_name.method_name  Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE statement (DDL Trigger)  ALTER TRIGGER trigger_name  ON { DATABASE | ALL SERVER }  [ WITH <ddl_trigger_option> [ ,...n ] ] { FOR | AFTER } { event_type [ ,...n ] | event_group }  AS { sql_statement [ ; ] | EXTERNAL NAME <method specifier>  [ ; ] }
 }   <ddl_trigger_option> ::=     [ ENCRYPTION ]     [ <EXECUTE AS Clause> ]  <method_specifier> ::=         assembly_name.class_name.method_name  Trigger on a LOGON event (Logon Trigger) ALTER TRIGGER trigger_name  ON ALL SERVER  [ WITH <logon_trigger_option> [ ,...n ] ] { FOR | AFTER } LOGON  AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  <logon_trigger_option> ::=     [ ENCRYPTION ]     [ EXECUTE AS Clause ]  <method_specifier> ::=     assembly_name.class_name.method_name
schema_name

DML 觸發器所屬架構的名稱。DML 觸發器的作用域是爲其創建該觸發器的表或視圖的架構。schema_name 僅在 DML 觸發器及其對應的表或視圖屬於默認架構時可選。對於 DDL 或登錄觸發器,無法指定 schema_name

trigger_name

要修改的現有觸發器。

table | view

對其執行 DML 觸發器的表或視圖。可以選擇指定表或視圖的完全限定名稱。

DATABASE

將 DDL 觸發器的作用域應用於當前數據庫。如果指定了此參數,則只要當前數據庫中出現 event_typeevent_group,就會激發該觸發器。

ALL SERVER

將 DDL 或登錄觸發器的作用域應用於當前服務器。如果指定了此參數,則只要當前服務器中的任何位置上出現 event_typeevent_group,就會激發該觸發器。

WITH ENCRYPTION

加密包含 ALTER TRIGGER 語句文本的 syscomments 項。使用 WITH ENCRYPTION 可以防止將觸發器作爲 SQL Server 複製的一部分進行發佈。不能爲 CLR 觸發器指定 WITH ENCRYPTION。

注意:
如果觸發器是使用 WITH ENCRYPTION 創建的,則要使該選項保持啓用,必須在 ALTER TRIGGER 語句中再次指定。
EXECUTE AS

指定用於執行該觸發器的安全上下文。讓您能夠控制 SQL Server 的實例在驗證對觸發器引用的任何數據庫對象的權限時使用的用戶帳戶。

有關詳細信息,請參閱 EXECUTE AS 子句 (Transact-SQL)

AFTER

指定只有在觸發 SQL 語句成功執行後,纔會激發觸發器。所有的引用級聯操作和約束檢查都成功完成後,才能激發此觸發器。

如果僅指定了 FOR 關鍵字,那麼 AFTER 是默認設置。

只能對錶定義 DML AFTER 觸發器。

INSTEAD OF

指定執行 DML 觸發器而不是觸發 SQL 語句,因此,其優先級高於觸發語句的操作。不能爲 DDL 或登錄觸發器指定 INSTEAD OF。

對於表或視圖,每個 INSERT、UPDATE 或 DELETE 語句最多可定義一個 INSTEAD OF 觸發器。但是,可以爲具有自己的 INSTEAD OF 觸發器的多個視圖定義視圖。

不允許在使用 WITH CHECK OPTION 創建的視圖上定義 INSTEAD OF 觸發器。將 INSTEAD OF 觸發器添加到指定了 WITH CHECK OPTION 的視圖時,SQL Server 將引發錯誤。用戶必須用 ALTER VIEW 刪除該選項後才能定義 INSTEAD OF 觸發器。

{ [DELETE] [,] [INSERT] [,] [UPDATE] } | { [INSERT] [,] [UPDATE]}

指定數據修改語句在試圖修改表或視圖時,激活 DML 觸發器。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些選項。如果指定的選項多於一個,需用逗號分隔這些選項。

對於 INSTEAD OF 觸發器,不允許對具有指定級聯操作 ON DELETE 的引用關係的表使用 DELETE 選項。同樣,也不允許對具有指定級聯操作 ON UPDATE 的引用關係的表使用 UPDATE 選項。有關詳細信息,請參閱 ALTER TABLE (Transact-SQL)

event_type

執行之後將導致激發 DDL 觸發器的 Transact-SQL 語言事件的名稱。觸發 DDL 觸發器的 DDL 事件中列出了在 DDL 觸發器中可用的事件。

event_group

預定義的 Transact-SQL 語言事件分組的名稱。執行任何屬於 event_group 的 Transact-SQL 語言事件之後,都將激發 DDL 觸發器。用於激發 DDL 觸發器的事件組中列出了在 DDL 觸發器中可用的事件組。在 ALTER TRIGGER 運行完成後,event_group 還將充當 macroby,將它涉及的事件類型添加到 sys.trigger_events 目錄視圖。

NOT FOR REPLICATION

表示當複製代理修改觸發器所涉及的表時,不應執行該觸發器。有關詳細信息,請參閱使用 NOT FOR REPLICATION 來控制約束、標識和觸發器

sql_statement

觸發條件和操作。

<method_specifier>

指定要與觸發器綁定的程序集的方法。該方法不能帶有任何參數,並且必須返回空值。class_name 必須是有效的 SQL Server 標識符,並且該類必須存在於可見程序集中。該類不能爲嵌套類。

有關 ALTER TRIGGER 的詳細信息,請參閱 CREATE TRIGGER (Transact-SQL) 中的“備註”部分。

DML 觸發器

通過表和視圖上的 INSTEAD OF 觸發器,ALTER TRIGGER 支持可手動更新的視圖。SQL Server 以相同的方式對所有類型的觸發器(AFTER、INSTEAD-OF)應用 ALTER TRIGGER。

可以使用 sp_settriggerorder 來指定要對錶執行的第一個和最後一個 AFTER 觸發器。對一個表只能指定第一個和最後一個 AFTER 觸發器。如果在同一個表上還有其他 AFTER 觸發器,這些觸發器將隨機執行。

如果 ALTER TRIGGER 語句更改了第一個或最後一個觸發器,將刪除所修改觸發器上設置的第一個或最後一個屬性,並且必須使用 sp_settriggerorder 重置順序值。

只有在成功執行觸發 SQL 語句之後,纔會執行 AFTER 觸發器。判斷執行成功的標準是:執行了所有與已更新對象或已刪除對象相關聯的引用級聯操作和約束檢查。AFTER 觸發器操作要檢查觸發語句的效果,也包括所有由觸發語句引起的 UPDATE 和 DELETE 引用級聯操作。

如果一個子表或引用表上的 DELETE 操作是由於父表的 CASCADE DELETE 操作所引起的,並且子表上定義了 DELETE 的 INSTEAD OF 觸發器,那麼將忽略該觸發器並執行 DELETE 操作。

DDL 觸發器

與 DML 觸發器不同,DDL 觸發器的作用域不是架構。因此,在查詢有關 DDL 觸發器的元數據時,不能使用 OBJECT_ID、OBJECT_NAME、OBJECTPROPERTY 和 OBJECTPROPERTY(EX)。請改用目錄視圖。有關詳細信息,請參閱獲取有關 DDL 觸發器的信息

若要更改 DML 觸發器,需要對於定義該觸發器所在的表或視圖擁有 ALTER 權限。

若要更改定義了服務器範圍 (ON ALL SERVER) 的 DDL 觸發器或者更改登錄觸發器,需要對該服務器擁有 CONTROL SERVER 權限。若要更改定義了數據庫範圍 (ON DATABASE) 的 DDL 觸發器,需要對當前數據庫擁有 ALTER ANY DATABASE DDL TRIGGER 權限。

以下示例創建一個 DML 觸發器,當用戶要在 SalesPersonQuotaHistory 表中添加或更改數據時,該觸發器將把用戶定義的消息打印到客戶端。然後使用 ALTER TRIGGER 對該觸發器進行了修改,以便只將其應用於 INSERT 活動。該觸發器有助於提醒向表中插入行或更新行的用戶及時通知 Compensation 部門。

USE AdventureWorks;
IF OBJECT_ID(N'Sales.bonus_reminder', N'TR') IS NOT NULL
DROP TRIGGER Sales.bonus_reminder;
GO
CREATE TRIGGER bonus_reminder
ON Sales.SalesPersonQuotaHistory
WITH ENCRYPTION
AFTER INSERT, UPDATE
AS RAISERROR ('Notify Compensation', 16, 10);
GO
-- Now, change the trigger.
USE AdventureWorks;
GO
ALTER TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
AFTER INSERT
AS RAISERROR ('Notify Compensation', 16, 10);
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章