sp_settriggerorder (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure 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, LOGONo 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:

  1. Desencadenador de nivel de servidor marcado First
  2. Otros desencadenadores de nivel de servidor
  3. Desencadenador de nivel de servidor marcado Last
  4. Desencadenador de nivel de base de datos marcado First
  5. Otros desencadenadores de nivel de base de datos
  6. 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';