sp_settriggerorder (Transact-SQL)
Especifica los desencadenadores AFTER que se activan en primer o último lugar. Los desencadenadores AFTER que se activan entre el primero y el último se ejecutan en orden indefinido.
Sintaxis
sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername'
, [ @order = ] 'value'
, [ @stmttype = ] 'statement_type'
[ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]
Argumentos
[ @triggername= ] '[ triggerschema**.] triggername'**
Es el nombre del desencadenador y el esquema al que pertenece, si procede, cuyo orden se va a establecer o cambiar. [triggerschema**.**]triggername es sysname. Si el nombre no corresponde a un desencadenador o si corresponde a un desencadenador INSTEAD OF, el procedimiento devolverá un error. triggerschema no se puede especificar para los desencadenadores DDL o logon.[ @order= ] 'value'
Es el valor del nuevo orden del desencadenador. value es de tipo varchar(10) y puede tener uno de los siguientes valores.Importante Los desencadenadores First y Last deben ser diferentes.
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.
[ @stmttype= ] 'statement_type'
Especifica la instrucción SQL que activa el desencadenador. statement_type es de tipo varchar(50) y puede ser INSERT, UPDATE, DELETE, LOGON o cualquier evento de instrucción Transact-SQL que aparezca en Eventos DDL. Los grupos de eventos no se pueden especificar.Un desencadenador puede designarse como First o Last para un tipo de instrucción sólo después de haber definido ese desencadenador como desencadenador para ese tipo de instrucción. Por ejemplo, el desencadenador TR1 puede designarse como First para INSERT en la tabla T1 si TR1 se define como desencadenador INSERT. Motor de base de datos devolverá un error si TR1, que se ha definido sólo como desencadenador INSERT, se establece en un desencadenador First o Last para una instrucción UPDATE. Para obtener más información, vea la sección Notas.
@namespace= { 'DATABASE' | 'SERVER' | NULL }
Cuando triggername es un desencadenador DDL, especifica si triggername se creó con un ámbito de base de datos o de servidor. Si triggername es un desencadenador de inicio de sesión, se debe especificar SERVER. Para obtener más información acerca del ámbito de los desencadenadores DDL, vea Diseñar desencadenadores DDL. Si no se especifica, o bien si se especifica NULL, triggername es un desencadenador DML.
Valores de código de retorno
0 (correcto) y 1 (error)
Comentarios
Desencadenadores DML
Sólo puede haber un desencadenador First y otro Last para cada instrucción en la misma tabla.
Si ya hay un desencadenador First definido en la tabla, base de datos o servidor, no podrá designar un nuevo desencadenador como First para el mismo statement_type en la misma tabla, base de datos o servidor. Esta restricción también se aplica a los desencadenadores Last.
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 primero. 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 el primero después de haber incluido una tabla en una suscripción, sp_settriggerorder devolverá un error. Si utiliza ALTER TRIGGER en el desencadenador de replicación o utiliza sp_settriggerorder para convertir al desencadenador de replicación en un desencadenador Last o None, la suscripción no funcionará correctamente.
Desencadenadores DDL
Si un desencadenador DDL con ámbito de base de datos y un desencadenador DDL con ámbito de servidor existen en el mismo evento, puede especificar que ambos desencadenadores sean First o Last. 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:
El desencadenador de servidor marcado First.
Otros desencadenadores de servidor.
El desencadenador de servidor marcado Last.
El desencadenador de base de datos marcado First.
Otros desencadenadores de base de datos.
El desencadenador de base de datos marcado Last.
Consideraciones generales sobre los desencadenadores
Si una instrucción ALTER TRIGGER cambia un desencadenador primero o último, se quitará el atributo First o Last establecido originalmente y el valor se reemplazará por None. El valor del orden deberá restablecerse con sp_settriggerorder.
Si el mismo desencadenador tiene que designarse como el orden primero o último para más de un tipo instrucción, deberá ejecutarse sp_settriggerorder para cada tipo de instrucción. Además, el desencadenador deberá definirse primero para un tipo de instrucción para que pueda designarse como el desencadenador First o Last que debe activarse para el tipo de instrucción.
Permisos
Para establecer el orden de un desencadenador DDL con ámbito de servidor (ON ALL SERVER) o de un desencadenador de inicio de sesión se requiere el permiso CONTROL SERVER.
Para establecer el orden de un desencadenador DDL con ámbito de base de datos (ON DATABASE), se necesita el permiso ALTER ANY DATABASE DDL TRIGGER.
Para establecer el orden de un desencadenador DML, se necesita el permiso ALTER para la tabla o la vista donde está definido el desencadenador.
Ejemplos
A. Configurar el orden de activación de un desencadenador DML
En el siguiente ejemplo se especifica que uSalesOrderHeader sea el primer desencadenador que se active después de que se produzca una operación UPDATE en la tabla Sales.SalesOrderHeader.
USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';
B. Configurar el orden de activación de un desencadenador DDL
El siguiente ejemplo especifica que ddlDatabaseTriggerLog sea el primer desencadenador que se active después de que se produzca un evento ALTER_TABLE en la tabla AdventureWorks2008R2.
USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';