sp_settriggerorder (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

指定 AFTER 第一個或最後一個引發的觸發程式。 在第 AFTER 一個和最後一個觸發程式之間引發的觸發程式會以未定義的順序執行。

Transact-SQL 語法慣例

語法

sp_settriggerorder
    [ @triggername = ] N'triggername'
    , [ @order = ] 'order'
    , [ @stmttype = ] 'stmttype'
    [ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]

引數

[ @triggername = ] N'triggername'

觸發程式和其所屬的架構名稱,如果適用,其順序為要設定或變更。 @triggername為 nvarchar(517),沒有預設值,且格式為 [ trigger_schema . ] trigger_name。 如果名稱未對應至觸發程式,或名稱對應至 INSTEAD OF 觸發程式,則程式會傳回錯誤。 無法為 DDL 或登入觸發程式指定架構。

[ @order = ] 'order'

觸發程式新順序的設定。 @order為 varchar(10),可以是下列任一值。

Description
First 觸發程式會先引發。
Last 觸發程式上次引發。
None 觸發程式會以未定義的順序引發。

重要

FirstLast 觸發程式必須是兩個不同的觸發程式。

[ @stmttype = ] 'stmttype'

指定引發觸發程式的 Transact-SQL 語句。 @stmttype為 varchar(50),而且可以是 INSERTUPDATEDELETELOGON或 DDL Events 中列出的任何 T-SQL 語句事件 無法指定事件群組。

只有在該觸發程式定義為該語句類型的觸發程序之後, First 才能將觸發程式指定為語句類型的 或 Last 觸發程式。 例如,如果定義為觸發程式,則可以在數據表T1上指定FirstINSERT觸發TR1程式。INSERTTR1 如果 只定義為觸發程式,則 資料庫引擎 會傳回錯誤TR1,該錯誤會設定為 First 語句的 或 Last 觸發程式UPDATEINSERT 如需詳細資訊,請參閱備註一節。

@namespace = { 'DATABASE' |'SERVER' |NULL }

當@triggername是 DDL 觸發程式時,@namespace指定是否使用資料庫範圍或伺服器範圍建立@triggername 如果 @triggername 是登入觸發程式, SERVER 則必須指定 。 如需 DDL 觸發程式範圍的詳細資訊,請參閱 DDL 觸發程式。 如果未指定,或 NULL 如果指定, @triggername 為 DML 觸發程式。

傳回碼值

0 (成功)和 1 (失敗)。

備註

本節討論數據操作語言 (DML) 和數據定義語言 (DDL) 觸發程序的考慮。

DML 觸發程序

單一數據表上的每個語句只能有一 First 個和一個 Last 觸發程式。

First如果數據表、資料庫或伺服器上已經定義觸發程式,則無法針對相同的數據表、資料庫或伺服器,為相同的@stmttype指定新的觸發First程式。 此限制也會套用 Last 觸發程式。

複寫會為包含在即時更新或佇列式更新訂閱的資料表,自動產生第一個觸發程序。 復寫要求其觸發程式是第一個觸發程式。 當您嘗試將含有第一個觸發程序的資料表包括在立即更新或佇列更新訂閱中,複寫會引發錯誤。 如果您嘗試在訂用帳戶中包含數據表之後,將觸發程式設為第一個觸發程式, sp_settriggerorder 則傳回錯誤。 如果您在 ALTER TRIGGER 復寫觸發程式上使用 ,或使用 sp_settriggerorder 將復寫觸發程式變更為 LastNone 觸發程式,則訂閱無法正常運作。

DDL 觸發程序

如果具有資料庫範圍的 DDL 觸發程式和伺服器範圍的 DDL 觸發程式存在於相同的事件上,您可以指定這兩個Last觸發程式都是First觸發程式或觸發程式。 不過,伺服器範圍的觸發程式一律會先引發。 一般而言,存在於相同事件上的 DDL 觸發程式執行順序如下:

  1. 標示的伺服器層級觸發程式 First
  2. 其他伺服器層級觸發程式
  3. 標示的伺服器層級觸發程式 Last
  4. 標示的資料庫層級觸發程式 First
  5. 其他資料庫層級觸發程式
  6. 標示的資料庫層級觸發程式 Last

一般觸發程序考慮

ALTER TRIGGER如果語句變更第一個或最後一個觸發程式,First則會卸除原本在觸發程式上設定的 或 Last 屬性,並將值取代為 None。 順序值必須使用 來重設 sp_settriggerorder

如果相同的觸發程式必須指定為多個語句類型的第一個或最後順序, sp_settriggerorder 則必須針對每個語句類型執行。 此外,必須先為語句類型定義觸發程式,才能將觸發程式指定為 FirstLast 觸發程式,才能針對該語句類型引發。

權限

使用伺服器範圍設定 DDL 觸發程式的順序, ON ALL SERVER或登入觸發程式需要 CONTROL SERVER 許可權。

使用資料庫範圍設定 ON DATABASEDDL 觸發程式的順序需要 ALTER ANY DATABASE DDL TRIGGER 許可權。

設定 DML 觸發程式的順序需要 ALTER 定義觸發程式之數據表或檢視表的許可權。

範例

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

下列範例會指定觸發程式uSalesOrderHeader是數據表上Sales.SalesOrderHeader發生作業之後要引發的第一個UPDATE觸發程式。

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'Sales.uSalesOrderHeader',
    @order = 'First',
    @stmttype = 'UPDATE';

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

下列範例會指定觸發ddlDatabaseTriggerLog程式是在資料庫中發生AdventureWorks2022事件之後引發的第一個ALTER_TABLE觸發程式。

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'ddlDatabaseTriggerLog',
    @order = 'First',
    @stmttype = 'ALTER_TABLE',
    @namespace = 'DATABASE';