Compartir a través de


Especificar el primer y el último desencadenador

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance

Puede especificar que uno de los desencadenadores AFTER asociados a una tabla sea el primero o el último que se ejecute para cada una de las acciones desencadenadoras INSERT, DELETE y UPDATE. Los desencadenadores AFTER que se activan entre el primero y el último se ejecutan en un orden indefinido.

Para especificar el orden de un desencadenador AFTER, use el procedimiento almacenado sp_settriggerorder . sp_settriggerorder tiene las opciones siguientes.

Opción Descripción
First Especifica que el desencadenador DML es el primer desencadenador AFTER que se activa para una acción desencadenadora.
Último Especifica que el desencadenador DML es el último desencadenador AFTER que se activa para una acción desencadenadora.
None Especifica que no hay ningún orden determinado para la activación del desencadenador DML. Se utiliza principalmente para restablecer un desencadenador que era el primero o el último.

En el siguiente ejemplo se muestra el uso de sp_settriggerorder:

sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'  

Importante

Los desencadenadores primero y último deben ser dos desencadenadores DML diferentes.

Una tabla puede tener los desencadenadores INSERT, UPDATE y DELETE definidos al mismo tiempo. Cada tipo de instrucción puede tener sus propios desencadenadores primero y último, pero no pueden ser los mismos.

Si el primer o último desencadenador definido para una tabla no cubre una acción desencadenadora, como FOR UPDATE, FOR DELETE o FOR INSERT, no habrá desencadenadores primero ni último para las acciones que falten.

No se pueden especificar desencadenadores INSTEAD OF como primero ni último desencadenador. Los desencadenadores INSTEAD OF se activan antes de actualizar las tablas subyacentes. Si un desencadenador INSTEAD OF realiza actualizaciones en las tablas subyacentes, éstas se realizarán después de que se activen los desencadenadores AFTER definidos en la tabla. Por ejemplo, si un desencadenador INSTEAD OF INSERT de una vista inserta datos en una tabla base y ésta contiene un desencadenador INSTEAD OF INSERT y tres desencadenadores AFTER INSERT, se activará el desencadenador INSTEAD OF INSERT de la tabla base en lugar de la acción de inserción, y los desencadenadores AFTER de la tabla base se activarán después de cualquier acción de inserción de la tabla base. Para más información, consulte DML Triggers.

Si una instrucción ALTER TRIGGER cambia un desencadenador primero o último, se quitará el atributo First o Last y el valor de orden se establecerá como None. Para restablecer el orden, se debe usar sp_settriggerorder.

La función OBJECTPROPERTY informa de si un desencadenador es un desencadenador primero o último mediante las siguientes propiedades: ExecIsFirstInsertTrigger, ExecIsFirstUpdateTrigger, ExecIsFirstDeleteTrigger, ExecIsLastInsertTrigger, ExecIsLastUpdateTrigger y ExecIsLastDeleteTrigger.

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. Tanto si usa ALTER en el desencadenador de replicación como si usa sp_settriggerorder para convertir el desencadenador de replicación en un desencadenador último o sin orden definido, la suscripción no funcionará correctamente.

Consulte también

OBJECTPROPERTY (Transact-SQL)
sp_settriggerorder (Transact-SQL)