sp_settriggerorder (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
Especifica los AFTER
desencadenadores que se activan primero o último. Los AFTER
desencadenadores que se activan entre los primeros y los últimos desencadenadores se ejecutan en orden indefinido.
Convenciones de sintaxis de Transact-SQL
Sintaxis
sp_settriggerorder
[ @triggername = ] N'triggername'
, [ @order = ] 'order'
, [ @stmttype = ] 'stmttype'
[ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]
Argumentos
[ @triggername = ] N'triggername'
Nombre del desencadenador y del esquema al que pertenece, si procede, cuyo orden se va a establecer o cambiar. @triggername es nvarchar(517), sin valor predeterminado y tiene el formato [ trigger_schema . ] trigger_name. Si el nombre no corresponde a un desencadenador o si el nombre corresponde a un INSTEAD OF
desencadenador, el procedimiento devuelve un error. No se puede especificar un esquema para desencadenadores DDL o de inicio de sesión.
[ @order = ] 'order'
Configuración del nuevo orden del desencadenador. @order es varchar(10) y puede ser cualquiera de los valores siguientes.
Valor | Descripción |
---|---|
First |
El desencadenador se activa primero. |
Last |
El desencadenador se activa el último. |
None |
El desencadenador se activa sin un orden definido. |
Importante
Los First
desencadenadores y Last
deben ser dos desencadenadores diferentes.
[ @stmttype = ] 'stmttype'
Especifica la instrucción Transact-SQL que desencadena el desencadenador. @stmttype es varchar(50) y puede ser INSERT
, UPDATE
, DELETE
, LOGON
o cualquier evento de instrucción T-SQL enumerado en eventos DDL. No se pueden especificar grupos de eventos.
Un desencadenador se puede designar como desencadenador First
o Last
para un tipo de instrucción solo después de que ese desencadenador se haya definido como un desencadenador para ese tipo de instrucción. Por ejemplo, el desencadenador TR1
se puede designar First
para INSERT
en la tabla T1
si TR1
se define como desencadenador INSERT
. El Motor de base de datos devuelve un error si TR1
, que se definió solo como desencadenadorINSERT
, se establece como desencadenador First
o Last
para una UPDATE
instrucción . Para obtener más información, vea la sección Notas.
@namespace = { 'DATABASE' | 'SERVER' | NULL }
Cuando @triggername es un desencadenador DDL, @namespace especifica si @triggername se creó con ámbito de base de datos o ámbito de servidor. Si @triggername es un desencadenador de inicio de sesión, SERVER
debe especificarse. Para obtener más información sobre el ámbito del desencadenador DDL, consulte Desencadenadores DDL. Si no se especifica o si NULL
se especifica, @triggername es un desencadenador DML.
Valores de código de retorno
0
(correcto) y 1
(error).
Comentarios
En esta sección se describen las consideraciones sobre los desencadenadores del lenguaje de manipulación de datos (DML) y del lenguaje de definición de datos (DDL).
Desencadenadores DML
Solo puede haber uno First
y un Last
desencadenador para cada instrucción en una sola tabla.
Si un First
desencadenador ya está definido en la tabla, la base de datos o el servidor, no puede designar un nuevo desencadenador que First
para la misma tabla, base de datos o servidor para la misma @stmttype. Esta restricción también aplica Last
desencadenadores.
La replicación genera automáticamente un primer desencadenador para cualquier tabla incluida en una suscripción de actualización inmediata o en cola. La replicación requiere que su desencadenador sea el primer desencadenador. Generará un error si se intenta incluir una tabla con un primer desencadenador en una suscripción de actualización inmediata o en cola. Si intenta convertir un desencadenador en un primer desencadenador después de incluir una tabla en una suscripción, sp_settriggerorder
devuelve un error. Si usa ALTER TRIGGER
en el desencadenador de replicación o para sp_settriggerorder
cambiar el desencadenador de replicación a un Last
desencadenador o None
, la suscripción no funciona correctamente.
Desencadenadores DDL
Si existe un desencadenador DDL con ámbito de base de datos y un desencadenador DDL con ámbito de servidor en el mismo evento, puede especificar que ambos desencadenadores sean un First
desencadenador o un Last
desencadenador. Sin embargo, los desencadenadores con ámbito de servidor siempre se inician en primer lugar. En general, el orden de ejecución de los desencadenadores DDL que existen en el mismo evento es el siguiente:
- Desencadenador de nivel de servidor marcado
First
- Otros desencadenadores de nivel de servidor
- Desencadenador de nivel de servidor marcado
Last
- Desencadenador de nivel de base de datos marcado
First
- Otros desencadenadores de nivel de base de datos
- Desencadenador de nivel de base de datos marcado
Last
Consideraciones generales sobre desencadenadores
Si una ALTER TRIGGER
instrucción cambia un primer o último desencadenador, el First
atributo o Last
establecido originalmente en el desencadenador se quita y el valor se reemplaza por None
. El valor de pedido debe restablecerse mediante sp_settriggerorder
.
Si se debe designar el mismo desencadenador como primer o último orden para más de un tipo de instrucción, sp_settriggerorder
debe ejecutarse para cada tipo de instrucción. Además, el desencadenador debe definirse primero para un tipo de instrucción antes de que se pueda designar como desencadenador First
o Last
que se active para ese tipo de instrucción.
Permisos
Establecer el orden de un desencadenador DDL con ámbito de servidor (creado ON ALL SERVER
) o un desencadenador de inicio de sesión requiere CONTROL SERVER
permiso.
Establecer el orden de un desencadenador DDL con ámbito de base de datos (creado ON DATABASE
) requiere ALTER ANY DATABASE DDL TRIGGER
permiso.
Establecer el orden de un desencadenador DML requiere ALTER
permiso en la tabla o vista en la que se define el desencadenador.
Ejemplos
A Establecer el orden de activación de un desencadenador DML
En el ejemplo siguiente se especifica que el desencadenador es el primer desencadenador uSalesOrderHeader
que se activará después de que se produzca una UPDATE
operación en la Sales.SalesOrderHeader
tabla.
USE AdventureWorks2022;
GO
EXEC sp_settriggerorder @triggername = 'Sales.uSalesOrderHeader',
@order = 'First',
@stmttype = 'UPDATE';
B. Establecer el orden de activación de un desencadenador DDL
En el ejemplo siguiente se especifica que el desencadenador es el primer desencadenador ddlDatabaseTriggerLog
que se desencadenará después de que se produzca un ALTER_TABLE
evento en la AdventureWorks2022
base de datos.
USE AdventureWorks2022;
GO
EXEC sp_settriggerorder @triggername = 'ddlDatabaseTriggerLog',
@order = 'First',
@stmttype = 'ALTER_TABLE',
@namespace = 'DATABASE';