Ver Mensaje Individual
  #4 (permalink)  
Antiguo 19/11/2014, 06:55
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Trigger calculo consumo

Movido a MySQL.

Respecto a esto:
Cita:
Lo que necesito saber es si hay alguna forma que al introducir un nuevo repostaje, mire esos km que acabas de meter y les reste el mismo campo del anterior repostaje con el mismo codigo de vehiculo.
Si la resta de datos que mencionas se debe hacer sobre la misma tabla, no, no es posible en MySQL, porque de ahcerse generaría un loop infinito.

El problema es así:
Cuando se dispara un TRIGGER se genera un bloqueo de escritura sobre la tabla, que queda en propiedad del proceso que disparó el trigger. Eso implica que no se pueden hacer llamadas DML sobre la misma tabla donde se está ejecutando el trigger (ten en cuenta que un UPDATE/INSERT/DELETE abre un nuevo hilo de proceso que no comparte código con el del TRIGGER en ejecución).

Ahora bien, el loop que menciono es porque como el trigger que planteas es por un UPDATE, si pudiese llamar a una modificacion en otro registro de la tabla, sería un UPDATE que a su vez dispararía nuevamente el trigger en otro hilo, que ejecutaría un UPDATE sobre la misma tabla, el cual dispararía el trigger, ... y así hasta el infinito.
Y no funcionaría tampoco si uno es INSERT y otro UPDATE, porque el UPDATE encontraría bloqueada la tabla a causa del trigger en INSERT, con lo que no podría ejecutarse jamás.

Por esa situacion, MySQL no permite ese tipo de llamadas, y sólo puede generar acciones DML sobre otras tablas, siempre y cuando esas no generen a su vez llamadas a las del trigger.

En definitiva, por seguridad de procesos los triggers y los SP en general tienen restricciones que el DBMS no deja violar.

por otro lado, a mi entender tu caso no necesita de un trigger, sino de un stored procedure para realizar el ISERT/UPDATE en la tabla de repostajes. En él sí podrías hacer toda la logica que necesitas sin necesidad de complicarlo de más.

¿Lo consideraste?

Sin conocer mas detalles del proyecto que presentas no puedo decirte demasiado, pero tu caso me recuerda un proyecto en el que trabajé hace unos años, y que tenia una problemática pareceida. En ese caso la solucion no la hicimos por triggers, y de hehco ni siquiera teníamos que restar nada a ningun registro. Un repostaje es una carga nueva, y cualquier dato que neesitaramos lo obteniamos por consultas...

Piensalo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)