Compartir a través de


Especificar los desencadenadores primero y último

Puede especificar que uno de los desencadenadores AFTER asociados a una tabla sea el primero o el último desencadenador AFTER que se activa tras cada acción de INSERT, DELETE y UPDATE. Los desencadenadores AFTER que se activan entre el primer y el último desencadenador se ejecutan en un orden no definido.

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

Opción Descripción
Primero Especifica que el desencadenador DML es el primer desencadenador AFTER disparado para una acción desencadenante.
última Especifica que el desencadenador DML es el último desencadenador POSTERIOR activado por una acción desencadenante.
Ninguno Especifica que no hay ningún orden específico en el que se debe desencadenar el desencadenador DML. Se utiliza principalmente para restablecer un disparador desde su estado de primero o último.

En el ejemplo siguiente 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 desencadenadores INSERT, UPDATE y DELETE definidos en ella al mismo tiempo. Cada tipo de instrucción puede tener sus propios activadores primero y último de forma individual, pero estos no pueden ser los mismos activadores.

Si el primer o último desencadenador definido para una tabla no cubre una acción de desencadenamiento, como no cubrir FOR UPDATE, FOR DELETE o FOR INSERT, no hay ningún desencadenador primero o último para las acciones que faltan.

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

Si una instrucción ALTER TRIGGER cambia un primer o último desencadenador, se quita el atributo First o Last y el valor de orden se establece en None. El orden debe restablecerse mediante sp_settriggerorder.

La función OBJECTPROPERTY informa de si un desencadenador es un desencadenador primero o último mediante las propiedades ExecIsFirstTrigger y ExecIsLastTrigger.

La replicación genera automáticamente un primer desencadenador para cualquier tabla que se incluya en una suscripción de actualización inmediata o en cola. La replicación requiere que su desencadenador sea el primer desencadenador. La replicación genera un error cuando intentas incluir una tabla con un desencadenador inicial 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 en el desencadenador de replicación o usa sp_settriggerorder para cambiar el desencadenador de replicación a un desencadenador último o ninguno, la suscripción no funcionará correctamente.

Véase también

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