sp_settriggerorder (Transact-SQL)

指定第一個或最後一個引發的 AFTER 觸發程序。在第一個和最後一個觸發程序之間引發的 AFTER 觸發程序,沒有任何既定的執行順序。

主題連結圖示Transact-SQL 語法慣例

語法

sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername' 
        , [ @order = ] 'value' 
        , [ @stmttype = ] 'statement_type' 
        [ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]

引數

  • [ @triggername= ] '[ triggerschema**.] triggername'**
    這是要設定或變更順序的觸發程序及所屬結構描述 (如果適用) 的名稱。[triggerschema**.**]triggername 是 sysname。如果名稱未對應於觸發程序,或名稱對應於 INSTEAD OF 觸發程序,程序會傳回錯誤。DDL 或登入觸發程序無法指定 triggerschema。

  • [ @order= ] 'value'
    這是觸發程序新順序的設定。value 是 varchar(10),它可能是下列值之一。

    重要事項重要事項

    第一個最後一個觸發程序必須是兩個不同的觸發程序。

    描述

    第一個

    最先引發觸發程序。

    最後一個

    最後引發觸發程序。

    觸發程序的引發,沒有任何既定順序。

  • [ @stmttype= ] 'statement_type'
    指定引發觸發程序的 SQL 陳述式。statement_type 是 varchar(50),它可以是 INSERT、UPDATE、DELETE、LOGON 或 DDL 事件中所列的任何 Transact-SQL 陳述式事件。您不能指定事件群組。

    只有在觸發程序已定義為某陳述式類型的觸發程序時,它才能指定為這個陳述式類型的第一個最後一個觸發程序。例如,如果 TR1 定義為 INSERT 觸發程序,TR1 觸發程序可以針對 T1 資料表的 INSERT 指定為第一個。如果只定義為 INSERT 觸發程序的 TR1 設為 UPDATE 陳述式的第一個最後一個觸發程序,Database Engine 會傳回錯誤。如需詳細資訊,請參閱<備註>一節。

  • @namespace= { 'DATABASE' | 'SERVER' | NULL }
    當 triggername 是 DDL 觸發程序時,指定使用資料庫範圍或伺服器範圍來建立 triggername。如果 triggername 是登入觸發程序,必須指定 SERVER。如需有關 DDL 觸發程序範圍的詳細資訊,請參閱<設計 DDL 觸發程序>。若未指定,或指定 NULL,triggername 就是一個 DML 觸發程序。

傳回碼值

0 (成功) 和 1 (失敗)

備註

DML 觸發程序

單一資料表的每個陳述式都只能有第一個最後一個觸發程序各一個。

如果已在資料表、資料庫或伺服器上定義了第一個觸發程序,您便無法針對相同 statement_type,將新的觸發程序指定為相同資料表、資料庫或伺服器的第一個觸發程序。這項限制也適用於最後一個觸發程序。

複寫會自動產生立即更新或佇列更新訂閱中所包括的任何資料表的第一個觸發程序。複寫需要觸發程序是第一個觸發程序。當您嘗試將含有第一個觸發程序的資料表包括在立即更新或佇列更新訂閱中,複寫會引發錯誤。如果您嘗試使觸發程序成為資料表併入訂閱之後的第一個觸發程序,sp_settriggerorder 會傳回錯誤。如果您在複寫觸發程序上使用 ALTER TRIGGER,或利用 sp_settriggerorder 將複寫觸發程序變更為最後一個觸發程序,訂閱便無法正常運作。

DDL 觸發程序

如果具有資料庫範圍的 DDL 觸發程序和具有伺服器範圍的 DDL 觸發程序都存在於相同的事件是,您可以將這兩個觸發程序指定為第一個觸發程序或最後一個觸發程序。不過,伺服器範圍的觸發程序一定會先觸發。一般來說,存在於相同事件上之 DDL 觸發程序的執行順序如下:

  1. 標記為第一個的伺服器層級觸發程序。

  2. 其他伺服器層級觸發程序。

  3. 標記為最後一個的伺服器層級觸發程序。

  4. 標記為第一個的資料庫層級觸發程序。

  5. 其他資料庫層級觸發程序。

  6. 標記為最後一個的資料庫層級觸發程序。

一般觸發程序考量

如果 ALTER TRIGGER 陳述式變更第一個或最後一個觸發程序,便會卸除觸發程序最初所設定的第一個最後一個屬性,會取代這個值。您必須利用 sp_settriggerorder 來重設順序值。

如果相同的觸發程序必須指定為多個陳述式類型的第一個或最後一個順序,每個陳述式類型都必須執行 sp_settriggerorder。另外,您也必須先將觸發程序定義給陳述式類型,然後才能將它指定為要針對這個陳述式類型來引發的第一個最後一個觸發程序。

權限

若要設定具有伺服器範圍 (在 ON ALL SERVER 上建立) 的 DDL 觸發程序或登入觸發程序的順序,便需要 CONTROL SERVER 權限。

若要設定具有資料庫範圍 (建立時設定 ON DATABASE) 的 DDL 觸發程序順序,便需要 ALTER ANY DATABASE DDL TRIGGER 權限。

設定 DML 觸發程序的順序時,需要觸發程序定義所在之資料表或檢視的 ALTER 權限。

範例

A. 設定 DML 觸發程序的引發順序

下列範例將 uSalesOrderHeader 觸發程序指定為在 Sales.SalesOrderHeader 資料表中發生 UPDATE 作業之後,所引發的第一個觸發程序。

USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

B. 設定 DDL 觸發程序的引發順序

下列範例將 ddlDatabaseTriggerLog 觸發程序指定為 AdventureWorks2008R2 資料庫發生 ALTER_TABLE 事件之後,所引發的第一個觸發程序。

USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';