Ver Mensaje Individual
  #4 (permalink)  
Antiguo 30/08/2012, 09:51
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: Algun ejemplo sencillo de trigger?

No puede enviar a realizar una operación DML contra la misma tabla que disparó el TRIGGER.
La tabla está bloqueada, por tanto no es accesible para INSERT/UPDATE/DELETE.

Me explico un poquito mejor:
Cuando un TRIGGER se dispara, la tabla que lo dispara se bloquea para escritura, por lo que no se puede hacer una operación de INSERT/UPDATE/DELETE sobre ella.
Si se pudiere hacer, podrías tener un loop infinito si la operación que realizas es del mismo tipo de la que disparó el trigger, por lo que dispararía otra vez el trigger, que haría la misma operación, la cual dispararía el trigger,.... y así hasta el infinito (no es cierto, sería mientras hay memoria RAM disponible para subprocesos).
¿Se entiende el por qué de la limitación?
El hecho de que la operación DML indicada sea diferente a la que lo disparó, es irrelevante, porque el algoritmo programado en MySLQ debe resolver el peor escenario, y por tanto lo bloqueará de todos modos.

Tampoco puedes acceder a los datos que están entrando o a los viejos llamándolos por su nombre de columna, porque el nombre de la columna no existe en el contexto de un TRIGGER. Lo asumiría como nombre de tabla o de variable no declarada.
Para poder acceder a esos valores existen las pseudovariables NEW y OLD, las cuales son algo así como punteros a un registro entrante y al registro a borrar o actualizar, en otro caso.
Por otro lado, tienes que tener en cuenta que un TRIGGER en MySQL es de ejecución obligatoria, por lo que la única forma de interrumpirlo es forzando un error, lo que es una mala práctica a la larga.
Otra cosa que los TRIGGERs no pueden hacer es llamar a SP o SF, por lo que no puedes usarlo para sortear la limitación, y tampoco puedes realizar procesos recursivos...

Un detalle más: Para lo que quieres hacer, los TRIGGER son una mala idea.
Hay otras formas de llegar a tu solución y que son mejores prácticas, INCLUYENDO el realizar una consulta previa al INSERT o UPDATE...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 30/08/2012 a las 10:13