Problema con lógica en trigger INSTEAD OF DELETE

11/12/2009 - 16:29 por José Luis | Informe spam
Hola a todos.

Tenemos una aplicación a la que no puedo acceder a la que tengo que prohibir
el borrado de registros en una determinada tabla.

He creado un trigger INSTEAD OF DELETE para evitar que, en función del
usuario, se puedan borrar estos registros. Además, si el usuario no está
autorizado a borrar datos, guardo un log de los intentos de borrado.

Hasta aquí todo muy bien, el funcionamiento es correcto si lanzo
instrucciones delete con distintos usuarios y el log se me actualiza sin
ningún problema. Cuando un usuario no autorizado intenta borrar un registro,
lanzo un error (Con RAISERROR) para notificar a la aplicación que el borrado
no se ha podido realizar.

El problema real viene cuando esta aplicación es la que borra registros.
Mediante el Profiler he visto que abre una transacción antes de ejecutar la
instrucción delete, ergo, antes de ejecutarse mi trigger. Al notificar el
error al programa, éste hace un ROLLBACK, y, aunque así consigo que no me
borre el registro, pierdo toda la información de auditoría que he insertado
durante la ejecución del trigger.


¿Alguien puede ayudarme con respecto a esto? En resumen, tengo que poder
hacer insert en una tabla desde un trigger que se ejecuta dentro de una
transacción QUE SÉ que se va a anular. Los datos insertados en la tabla,
dentro de la transacción no deben eliminarse cuando la aplicación haga el
ROLLBACK de su transacción.


Gracias :)


__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 4679 (20091211) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com
 

Leer las respuestas

#1 Victor Koch
11/12/2009 - 17:22 | Informe spam
Hola,

Habría que ver si podes sacar de la transacción de la eliminación de los
registros, cuando lo hace la aplicación y no el operador, la inserción del
registro de auditoria cosa que cuando se haga un ROLLBACK este no afecte la
inserción de la auditoria.

Un Saludo, Víctor Koch



"José Luis" escribió en el mensaje
news:
Hola a todos.

Tenemos una aplicación a la que no puedo acceder a la que tengo que
prohibir el borrado de registros en una determinada tabla.

He creado un trigger INSTEAD OF DELETE para evitar que, en función del
usuario, se puedan borrar estos registros. Además, si el usuario no está
autorizado a borrar datos, guardo un log de los intentos de borrado.

Hasta aquí todo muy bien, el funcionamiento es correcto si lanzo
instrucciones delete con distintos usuarios y el log se me actualiza sin
ningún problema. Cuando un usuario no autorizado intenta borrar un
registro, lanzo un error (Con RAISERROR) para notificar a la aplicación
que el borrado no se ha podido realizar.

El problema real viene cuando esta aplicación es la que borra registros.
Mediante el Profiler he visto que abre una transacción antes de ejecutar
la instrucción delete, ergo, antes de ejecutarse mi trigger. Al notificar
el error al programa, éste hace un ROLLBACK, y, aunque así consigo que no
me borre el registro, pierdo toda la información de auditoría que he
insertado durante la ejecución del trigger.


¿Alguien puede ayudarme con respecto a esto? En resumen, tengo que poder
hacer insert en una tabla desde un trigger que se ejecuta dentro de una
transacción QUE SÉ que se va a anular. Los datos insertados en la tabla,
dentro de la transacción no deben eliminarse cuando la aplicación haga el
ROLLBACK de su transacción.


Gracias :)

__________ Información de ESET NOD32 Antivirus, versión de la base de
firmas de virus 4679 (20091211) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com



Preguntas similares