Share via


sp_settriggerorder (Transact-SQL)

更新: 2006 年 12 月 12 日

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

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

語法

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

引數

  • [ @triggername= ] '[ triggerschema**.****] triggername**'**
    這是要設定或變更順序的觸發程序及所屬結構描述 (適用的話) 的名稱。[triggerschema**.**]triggernamesysname。如果名稱未對應於觸發程序,或名稱對應於 INSTEAD OF 觸發程序,程序會傳回錯誤。DDL 或登入觸發程序無法指定 triggerschema
  • [ @order= ] 'value'
    這是觸發程序新順序的設定。valuevarchar(10),它可能是下列值之一。

    ms186762.note(zh-tw,SQL.90).gif重要事項:
    第一個最後一個觸發程序必須是兩個不同的觸發程序。
    描述

    第一個

    最先引發觸發程序。

    最後一個

    最後引發觸發程序。

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

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

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

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

傳回碼值

0 (成功) 和 1 (失敗)

備註

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

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

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

如果 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 AdventureWorks;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

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

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

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

請參閱

參考

系統預存程序 (Transact-SQL)
Database Engine 預存程序 (Transact-SQL)
ALTER TRIGGER (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 12 月 12 日

新增內容:
  • 在整個主題內新增登入觸發程序的相關資訊,登入觸發程序是 SQL Server 2005 Service Pack 2 加入的新功能。