Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Duda con triggers

Estas en el tema de Duda con triggers en el foro de Mysql en Foros del Web. hola quiciera saber si se puede crear un trigger que solo se ejecute si se modifica una sola columna ? ejemplo tengo la tabla usuarios ...
  #1 (permalink)  
Antiguo 27/12/2010, 14:50
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 1 mes
Puntos: 15
Duda con triggers

hola quiciera saber si se puede crear un trigger que solo se ejecute si se modifica una sola columna ? ejemplo

tengo la tabla

usuarios

idusuario
nombre
apellido
direccion
dinero
gasolina

y solo quiero que el triger se ejecute si solo se modifica dinero si se modifica nombre u otra no.

saludos
  #2 (permalink)  
Antiguo 27/12/2010, 20:04
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Duda con triggers

Lamentablemente, los TRIGGERS se ejecutan por eventos de tabla y no de columna (INSERT, UPDATE o DELETE). Lo más que puedes hacer es que la tarea se realice si y sólo si se recibe un valor en ese campo (NEW.nombrecampo), pero de todos modos el TRIGGER en sí se disparará siempre.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 28/12/2010, 07:00
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 1 mes
Puntos: 15
Respuesta: Duda con triggers

Hola muchas gracias por la respuesta seria algo de este estilo.

Código SQL:
Ver original
  1. CREATE TRIGGER historial_usuarios AFTER UPDATE ON usuarios
  2. FOR EACH ROW
  3. BEGIN
  4.  
  5. IF(OLD.dinero=!NEW.dinero) THEN
  6. INSERT INTO hclientes(idusuario,anterio_dinero , nuevo_dinero, fecha)
  7. VALUES (OLD.idusuario,OLD.dinero , NEW.dinero, NOW());
  8. END IF;
  9.  
  10. END;

saludos
  #4 (permalink)  
Antiguo 28/12/2010, 07:22
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Duda con triggers

No exactamente, porque los campos llegan aunque no los invoques en el UPDATE, ya que forman parte de la estructura de la tabla. En esencia, ese modelo podría ejecutarse si, por ejemplo, NEW.dinero fuese igual a cero y OLD.dinero no, cosa que puede darse si simplemente el UPDATE que ejecutes no incluye una cantidad nueva para el campo....

Recuerda que en un TRIGGER, el registro entrante es una estructura completa, con todos sus campos, aún aquellos que no uses para enviar valores, porque lo que hace MySQL es crear un registro entero y luego asignar sólo los campos indicados en la sentencia... pero los demás siguen existiendo.

¿Se entiende la idea?

Probablemente algo parecido a esto funcione mejor:

Código MySQL:
Ver original
  1. CREATE TRIGGER historial_usuarios AFTER UPDATE ON usuarios
  2.     IF (NEW.dinero IS NOT NULL OR NEW.dinero != 0) THEN
  3.         INSERT INTO hclientes(idusuario,anterio_dinero , nuevo_dinero, fecha)
  4.         VALUES (OLD.idusuario, OLD.dinero , NEW.dinero, NOW());
  5.     END IF;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 28/12/2010, 07:53
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 1 mes
Puntos: 15
Respuesta: Duda con triggers

Pues no entendi muy esta parte

"cosa que puede darse si simplemente el UPDATE que ejecutes no incluye una cantidad nueva para el campo...."

y probando el ejemplo me tira este error.

Script line: 1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 6

pues esta fue una opcion que pense para hacer el historial de un usuario , pero no se si se pueda hacer de otra forma.?

saludos
  #6 (permalink)  
Antiguo 28/12/2010, 08:23
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Duda con triggers

Delimitadores, delimitadores, delimitadores... Ya te lo dije en otra ocasión:
Código MySQL:
Ver original
  1. DELIMITER$$
  2. CREATE TRIGGER historial_usuarios AFTER UPDATE ON usuarios
  3.     IF (NEW.dinero IS NOT NULL OR NEW.dinero != 0) THEN
  4.         INSERT INTO hclientes(idusuario,anterio_dinero , nuevo_dinero, fecha)
  5.         VALUES (OLD.idusuario, OLD.dinero , NEW.dinero, NOW());
  6.     END IF;
  7. END$$
  8. DELIMITER ;

Respecto a esto:
Cita:
"cosa que puede darse si simplemente el UPDATE que ejecutes no incluye una cantidad nueva para el campo...."
piensalo de esta forma:
Cuando haces un UPDATE en el que no estás actualizando la totalidad de los campos de la tabla, los restantes, ¿existen o no para la pseudovariable NEW? La respuesta es SI, existen, pero no contienen valores o contienen NULL.
En tu caso, si te planteas que registre la transacción si lo que entra es diferente a lo que está, puede llegar a registrarse cuando envíes un UPDATE que afecte otros campos, pero no ese. Y creo que esa no es tu idea.
Por eso es conveniente que antes que controlar si son iguales, hay que verificar si el campo entrante contiene un valor legal y recién entonces verificar si los datos son diferentes.

¿Se entiende más?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 28/12/2010, 08:33
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 1 mes
Puntos: 15
Respuesta: Duda con triggers

si ahora ya te entendi pero si se comprueba primero que el valor que tiene new.dinero no es cero ni NULL entonces no habria necesidad de comprobar si es diferente pues si se cumple lo primero es porque si hay algun valor nuevo en el UPDATE?

saludos
  #8 (permalink)  
Antiguo 28/12/2010, 08:36
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Duda con triggers

No. Puede que el valor de ese campo además de no ser NULL ni cero, sea al mismo tiempo igual a lo que ya está, caso en que en realidad MySQL no realiza el UPDATE, y por tanto no hay transacción registrable desde ese punto de vista.

Eso es importante a tener en cuenta: MySQL no actualiza campos si el valor a ingresar es igual al que ya contiene ese mismo campo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 28/12/2010, 08:42
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 1 mes
Puntos: 15
Respuesta: Duda con triggers

Entonces si tendria que ir la condicional

la coloque asi

Código MySQL:
Ver original
  1. IF (NEW.dinero IS NOT NULL OR NEW.dinero != 0 AND NEW.dinero!=OLD.dinero) THEN
  2.  
  3. INSERT INTO husuarios(iduFB,valor_anterior, valor_nuevo,atributo,fecha)
  4. VALUES (OLD.iduFB,OLD.dinero,NEW.dinero,'DINERO',NOW());

voy hacer pruebas de como se comporta y comento como me fue.


saludos
  #10 (permalink)  
Antiguo 28/12/2010, 09:00
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Duda con triggers

Cuidado con la lógica de las consultas, los paréntesis producen efectos en la evalaución de las condiciones.
El OR puesto como condicional de esa forma puede dar un resultado incorrecto, porque bastaría con que NEW.dinero fuese NOT NULL para ser TRUE, y es ano es la idea
Es mejor ponerlo como:
Código MySQL:
Ver original
  1. IF (NEW.dinero IS NOT NULL OR NEW.dinero != 0) AND (NEW.dinero!=OLD.dinero) THEN
Es decir: Que sea NOT NULL o bien diferente de cero, y además que sea diferente de lo que ya existe.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 28/12/2010, 09:24
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 1 mes
Puntos: 15
Respuesta: Duda con triggers

Si haciendo las pruebas me di cuenta de eso y lo coloque asi me funciono

Código MySQL:
Ver original
  1. IF (NEW.dinero IS NOT NULL AND NEW.dinero != 0 AND NEW.dinero!=OLD.dinero) THEN


pero creo que seria mejor como tu dijiste colocandolos en parentesis separados.


muchas gracias por tu ayuda me ayudo muchisimo.


saludos
  #12 (permalink)  
Antiguo 28/12/2010, 09:50
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Duda con triggers

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

Etiquetas: trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:13.