En SQL Server 2005, ¿hay alguna manera para que un desencadenador descubra qué objeto es responsable de disparar el desencadenador? Me gustaría utilizar esto para desactivar el desencadenante de un prodecure almacenado.¿Hay alguna manera de deshabilitar un desencadenador de SQL Server solo para un ámbito de ejecución particular?
¿Hay alguna otra manera de desactivar el activador solo para la transacción actual? Podría usar el siguiente código, pero si no me equivoco, también afectaría las transacciones concurrentes, lo que sería algo malo.
DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } ON { object_name | DATABASE | ALL SERVER } [ ; ]
ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } ON { object_name | DATABASE | ALL SERVER } [ ; ]
Si es posible, me gustaría evitar la técnica de tener un campo "NOTRIGGER" en mi mesa y hacer un NoTrigger = null
, porque me gustaría mantener la mesa lo más pequeño posible.
La razón por la que quisiera evitar el activador es porque contiene lógica que es importante para las actualizaciones manuales de la tabla, pero mi procedimiento almacenado se encargará de esta lógica. Debido a que este será un procedimiento muy utilizado, quiero que sea rápido.
Los activadores imponen una carga adicional en el servidor porque inician una transacción implícita. Tan pronto como se ejecuta un disparador, se inicia una nueva transacción implícita, y cualquier recuperación de datos dentro de una transacción mantendrá bloqueos en las tablas afectadas.
Desde: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1170220,00.html#trigger
puede usar la función ** Exec ** para activar y activar desencadenantes desde un procedimiento almacenado. Ejemplo: 'EXEC ('ENABLE TRIGGER dbo.TriggerName en dbo.TriggeredTable')' –