Transacciones en triggers


([N1] sergi.esteve) #1

Hola.

A ver si alguien puede ayudarme.

¿Cómo puedo hacer que en un trigger de una tabla se ejecute en una transacción?

Mi problema.

Tabla de facturas, de la que cuelga una tabla de vencimientos de factura y de la que cuelga una tabla de cobros de vencimientos.

Los vencimientos con cobros no quiero que se borren.

En el trigger de antes de borrar la factura, tengo código para borrar líneas de factura, desmarcar albaranes de factura y borrar vencimientos, en ese orden.

Cuando le doy a eliminar una factura, si esta tiene vencimientos cobrados, descubro que correctamente no la borra, pero, acto seguido, me doy cuenta de que ha borrado las líneas y ha desmarcado los albaranes, es decir, NO HACE ROLLBACK.

¿Esto es así?, porque no lo entiendo.

¿Hay alguna forma de que el código se ejecute en una transacción?


([N2] AyudaVelneo) #2

Hola Sergi:

Vencimientos y cobros son plurales de facturas… pero no de Líneas ni de Albaranes, por lo que elimina los registros que no tienen plurales.

Puedes comprobar al principio del trigger si la factura tiene vencimientos cobrados. Si los tiene pones una variable booleana a 1… en caso contrario la dejas a 0

Antes de eliminar líneas y desmarcar los albaranes verificas esta variable… si está a 1 no haces nada y si está a 0 eliminas líneas y desmarcas albaranes.

Espero que te sirva.

Un saludo


([N1] sergi.esteve) #3

Hola, gracias por tu respuesta.

Así es como lo tengo hecho porque no he visto otra forma, pero no me parece lógico no poder ejecutar en una trasacción, haciéndolo de la forma que comentas, tengo que controlar yo todas las posibilidades de fallo por código, si se te escapa algún error posible … transacción a medias y base de datos comprometida porque no hace rollback de nada de lo que ha hecho.

Si no hay forma de hacer transacciones, de acuerdo, pero pienso que se debería estudiar para futuras versiones, pues me parece un agujero tremendo. La verdad, yo daba por hecho que todo el código se ejecutaba dentro de una transacción, me he quedado de piedra al ver que no es así.