trigger - Desencadenadores de SQL Server-orden de ejecución
trigger para bitacora sql server (10)
¿Alguien sabe cómo el Servidor SQL determina los disparadores de órdenes (del mismo tipo, es decir, antes de los desencadenadores) que se ejecutan? Y hay alguna forma de cambiar esto para poder especificar el orden que quiero. Si no, porque no.
Gracias.
La orden la establece el servidor sql, lo único que puede hacer es usar un sp de sistema (sp_settriggerorder) para establecer qué disparador disparará primero y cuál disparará al último.
Más allá de configurar el primer y último activador para disparar, no puede modificar ni indicar qué orden usará el servidor sql. Por lo tanto, querrá construir sus desencadenantes para que no confíen en el orden en que se dispararon. Incluso si determina el orden en el que disparan hoy, puede cambiar mañana.
Esta información se basa en Sql Server 2000; sin embargo, no creo que 2005/2008 actúe de manera diferente a este respecto.
Puede garantizar qué disparador se dispara primero, qué disparador se dispara al último y cuáles dispara en el medio usando sp_settriggerorder. Si necesita sincronizar más de tres, no parece posible en SQL Server 2005.
Aquí hay una muestra tomada de aquí (el artículo vinculado tiene mucha más información).
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
Puede usar sp_settriggerorder para definir el orden de cada activador en una tabla.
Sin embargo, yo diría que sería mucho mejor tener un único disparador que haga muchas cosas. Esto es particularmente cierto si el orden es importante, ya que esa importancia no será muy obvia si tiene múltiples factores desencadenantes. Imagínese que alguien intenta respaldar la base de datos meses / años en la pista. Por supuesto, es probable que existan casos en los que necesite tener múltiples factores desencadenantes o que realmente sea un mejor diseño, pero comenzaría a suponer que debería tener uno y trabajar desde allí.
Usar SetTriggerOrder está bien, pero si su código depende de una secuencia específica de ejecución, ¿por qué no ajusta todos los desencadenantes en los procedimientos almacenados y hace que el primero llame al segundo, el segundo al tercero, etc.
Entonces simplemente tienes que ejecutar al primero en el gatillo.
Alguien en el futuro estará agradecido de que no tuvieron que buscar en una tabla del sistema para determinar una secuencia de ejecución personalizada.
Use este procedimiento almacenado del sistema:
sp_settriggerorder[@triggername = ] ''triggername'', [@order = ] ''value'', [@stmttype = ] ''statement_type''
sp_settriggerorder solo se aplica a los desencadenadores DESPUÉS.
Una declaración de un millón de dólares en este contexto:
sp_settriggerorder: especifica los desencadenadores DESPUÉS que se disparan primero o último. Los desencadenadores DESPUÉS que se disparan entre el primer y el último activador se ejecutan en un orden indefinido.
Fuente: MSDN
Utilizar esta :
Por ejemplo :
USE AdventureWorks;
GO
EXEC sys.sp_settriggerorder @triggername = N'''', -- nvarchar(517)
@order = '''', -- varchar(10)
@stmttype = '''', -- varchar(50)
@namespace = '''' -- varchar(10)
Los activadores Primero y Último deben ser dos activadores diferentes.
Primero: el disparador se dispara primero.
Last: Trigger se dispara al último.
Ninguno: el disparador se dispara en un orden indefinido.
Y vea este enlace para obtener el valor de @stmttype
: DDL Events
Y para @namespace = {''DATABASE'' | ''SERVIDOR'' | NULL} y para más información ver: Disparadores DDL
Utilice el procedimiento almacenado sp_Settriggerorder
, puede definir el orden de ejecución del desencadenador.
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
El segundo parámetro, "orden" puede tomar tres valores, lo que significa que puede tener en cuenta hasta tres disparadores.
- Primero - El gatillo se dispara primero
- Último - El gatillo se dispara el último
- Ninguno - El disparador se dispara en orden aleatorio.
Si estás preocupado por las órdenes de activación, entonces realmente debes dar un paso atrás y considerar lo que estás tratando de hacer y si hay una mejor manera de hacerlo. El hecho de que esto no sea algo fácil de cambiar debería estar diciéndote algo.
Los desencadenantes siempre se ven como una verdadera solución ordenada, y en el lugar correcto son muy valiosos, pero el precio es alto, es muy fácil crear pesadillas de depuración con ellos. He perdido muchas horas en el pasado al intentar depurar algún oscuro comportamiento de la base de datos solo para encontrar que la causa está oculta en un desencadenante pasado por alto.