Detectar cambios precisos realizados en 1 registro por medio de un trigger

Iniciado por OssoH, 13 Junio 2018, 19:08 PM

0 Miembros y 1 Visitante están viendo este tema.

OssoH

Tengo una tabla y quiero guardar los cambios que se hacen de forma que disponga de un log.
Habia pensado en algo como esto


    DELIMITER $$
    CREATE TRIGGER `bdprueba`.`user_stream_afterupdate` after
    update ON `bdprueba`.`user` FOR EACH ROW
    BEGIN
     
    DECLARE columnasamostrar VARCHAR(150) DEFAULT ''; # Esta es la variable que me alamacenara todos los cambios realizados
     
    /*Comparación de Cada una de las Calumnas if es diferente se le concatena a la variable que guarda todos los cambios realizados*/
    IF (OLD.apellido1 <> NEW.apellido1) THEN SET columnasamostrar = CONCAT_WS(columnasamostrar,CONCAT('Antes : ',OLD.apellido1),CONCAT(' Ahora: ',NEW.apellido1)); END IF;
    IF (OLD.apellido2 <> NEW.apellido2) THEN SET columnasamostrar = CONCAT_WS(columnasamostrar,CONCAT('Antes : ',OLD.apellido2),CONCAT(' Ahora: ',NEW.apellido2)); END IF;
    IF (OLD.nombre1 <> NEW.nombre1) THEN SET columnasamostrar = CONCAT_WS(columnasamostrar,CONCAT_WS('Antes : ',OLD.nombre1),CONCAT_WS(' Ahora: ',NEW.nombre1)); END IF;
    IF (OLD.nombre2 <> NEW.nombre2) THEN SET columnasamostrar = CONCAT_WS(columnasamostrar,CONCAT_WS('Antes : ',OLD.nombre2),CONCAT_WS(' Ahora: ',NEW.nombre2)); END IF;
     
     
    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
     END$$
    DELIMITER ;



El problema que me comentan es que aunque pueda hacerlo el impacto del rendimiento sería muy alto al ejectuar todas las veces que haya un UPDATE en las tabla... Por lo tanto si la idea es hacer una auditoría me dicen que es completamente impráctico.

¿ se os ocurre alguna otra forma mejor?

Gracias

EFEX

Completamente impractico? Es para esto que se utilizan triggers en base de datos. Para mantener un log de los cambios en tu BD.

Rendimiento? solo haces un insert por cada vez que se hacen cambios en tu tabla de usuarios. Se puede pulir un poco el codigo, pero no creo que estes equivocado.
GITHUB 

OssoH


Hadess_inf

Deberías comprar el estado de OLD con NEW y si es diferente recién proceder a insertar.

IF OLD != NEW THEN
   -- INSERTA EN TABLA
END IF;