sp_settriggerorder (Transact-SQL)
適用於:SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體
指定 AFTER
第一個或最後一個引發的觸發程式。 在第 AFTER
一個和最後一個觸發程式之間引發的觸發程式會以未定義的順序執行。
語法
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 |
觸發程式會以未定義的順序引發。 |
重要
First
和 Last
觸發程式必須是兩個不同的觸發程式。
[ @stmttype = ] 'stmttype'
指定引發觸發程式的 Transact-SQL 語句。 @stmttype為 varchar(50),而且可以是 INSERT
、UPDATE
、DELETE
、 LOGON
或 DDL Events 中列出的任何 T-SQL 語句事件。 無法指定事件群組。
只有在該觸發程式定義為該語句類型的觸發程序之後, First
才能將觸發程式指定為語句類型的 或 Last
觸發程式。 例如,如果定義為觸發程式,則可以在數據表T1
上指定First
INSERT
觸發TR1
程式。INSERT
TR1
如果 只定義為觸發程式,則 資料庫引擎 會傳回錯誤TR1
,該錯誤會設定為 First
語句的 或 Last
觸發程式UPDATE
。INSERT
如需詳細資訊,請參閱備註一節。
@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
將復寫觸發程式變更為 Last
或 None
觸發程式,則訂閱無法正常運作。
DDL 觸發程序
如果具有資料庫範圍的 DDL 觸發程式和伺服器範圍的 DDL 觸發程式存在於相同的事件上,您可以指定這兩個Last
觸發程式都是First
觸發程式或觸發程式。 不過,伺服器範圍的觸發程式一律會先引發。 一般而言,存在於相同事件上的 DDL 觸發程式執行順序如下:
- 標示的伺服器層級觸發程式
First
- 其他伺服器層級觸發程式
- 標示的伺服器層級觸發程式
Last
- 標示的資料庫層級觸發程式
First
- 其他資料庫層級觸發程式
- 標示的資料庫層級觸發程式
Last
一般觸發程序考慮
ALTER TRIGGER
如果語句變更第一個或最後一個觸發程式,First
則會卸除原本在觸發程式上設定的 或 Last
屬性,並將值取代為 None
。 順序值必須使用 來重設 sp_settriggerorder
。
如果相同的觸發程式必須指定為多個語句類型的第一個或最後順序, sp_settriggerorder
則必須針對每個語句類型執行。 此外,必須先為語句類型定義觸發程式,才能將觸發程式指定為 First
或 Last
觸發程式,才能針對該語句類型引發。
權限
使用伺服器範圍設定 DDL 觸發程式的順序, ON ALL SERVER
或登入觸發程式需要 CONTROL SERVER
許可權。
使用資料庫範圍設定 ON DATABASE
DDL 觸發程式的順序需要 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';