Ver Mensaje Individual
  #1 (permalink)  
Antiguo 11/03/2015, 07:30
elpropiopato23
 
Fecha de Ingreso: octubre-2011
Ubicación: Niquitao
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Detectar cambios precisos realizados en 1 registro por medio de un trigger

Buenas Días amigos de foros del web:

Quería preguntarles si es posible detectar cambios precisos realizados en 1 registro de una tabla por medio de un trigger y almacenar todas las columnas que se hayan modificado en un campo, sería algo como utilizar en el trigger Una comparación de Columnas OLD y NEW y en dicha comparación si es diferente esta misma meterle a una variable el antes y después, para que cuando se hayan comparados todas las columnas del registro con el antes y el después, me mande en un solo campo todos los cambios realizados en una sola columna por medio de la variable.
Me explicare:

Tengo una tabla user con los campos iduser,apellido1, apellido2, nombre1,nombre2
El trigger sería así:

Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE TRIGGER `bdprueba`.`user_stream_afterupdate` after
  3. update ON `bdprueba`.`user` FOR EACH ROW
  4.  
  5. DECLARE columnasamostrar VARCHAR(150) DEFAULT ''; # Esta es la variable que me alamacenara todos los cambios realizados
  6.  
  7. /*Comparación de Cada una de las Calumnas if es diferente se le concatena a la variable que guarda todos los cambios realizados*/
  8. IF (OLD.apellido1 <> NEW.apellido1) THEN SET columnasamostrar = CONCAT_WS(columnasamostrar,CONCAT('Antes : ',OLD.apellido1),CONCAT(' Ahora: ',NEW.apellido1)); END IF;
  9. IF (OLD.apellido2 <> NEW.apellido2) THEN SET columnasamostrar = CONCAT_WS(columnasamostrar,CONCAT('Antes : ',OLD.apellido2),CONCAT(' Ahora: ',NEW.apellido2)); END IF;
  10. IF (OLD.nombre1 <> NEW.nombre1) THEN SET columnasamostrar = CONCAT_WS(columnasamostrar,CONCAT_WS('Antes : ',OLD.nombre1),CONCAT_WS(' Ahora: ',NEW.nombre1)); END IF;
  11. IF (OLD.nombre2 <> NEW.nombre2) THEN SET columnasamostrar = CONCAT_WS(columnasamostrar,CONCAT_WS('Antes : ',OLD.nombre2),CONCAT_WS(' Ahora: ',NEW.nombre2)); END IF;
  12.  
  13.  
  14. INSERT INTO changesonusers(iduser, description) VALUES(OLD.iduser,columnasamostrar); #se guarda EN 1 SOLO REGISTRO (NO en varios), todo lo que se modifico en una tabla llamada changesonusers
  15.  END$$
  16. DELIMITER ;

El problema es que este trigger me ingresa 1 registro por cada columna modificada y yo necesito es que todas las modificaciones se almacenen en 1 solo registro no en varios, este trigger me hace lo siguiente :
Código MySQL:
Ver original
  1. #por ejemplo si modifico un registro en el que apellido2 era igual a Gutierrez por Sanchez  y nombre2 era igual a Juan por Pedro, en la tabla changesonusers se ingresaria esto:
  2. +-------------------------------------+
  3. |iduser|         description          |
  4. |-------------------------------------|
  5. |  1   |Antes:Gutierrez Ahora:Sanchez |
  6. |-------------------------------------|
  7. |  1   |Antes:Juan Ahora:Pedro        |
  8. |-------------------------------------|
  9.  
  10. # Pero yo lo que necesito que haga es esto
  11.  
  12. +------------------------------------------------------------+
  13. |iduser|                 description                         |
  14. |------------------------------------------------------------|
  15. |  1   |Antes:Gutierrez Ahora:Sanchez,Antes:Juan Ahora:Pedro |
  16. |------------------------------------------------------------|

Es posible Hacerlo cualquier ayuda será bienvenida
Mil gracias...