Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: OssoH en 13 Junio 2018, 19:08 pm



Título: Detectar cambios precisos realizados en 1 registro por medio de un trigger
Publicado por: OssoH en 13 Junio 2018, 19:08 pm
Tengo una tabla y quiero guardar los cambios que se hacen de forma que disponga de un log.
Habia pensado en algo como esto

Código:
    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


Título: Re: Detectar cambios precisos realizados en 1 registro por medio de un trigger
Publicado por: EFEX en 13 Junio 2018, 20:22 pm
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.


Título: Re: Detectar cambios precisos realizados en 1 registro por medio de un trigger
Publicado por: OssoH en 13 Junio 2018, 20:25 pm
Gracias, entonces seguiré en la misma línea :)


Título: Re: Detectar cambios precisos realizados en 1 registro por medio de un trigger
Publicado por: Hadess_inf en 16 Junio 2018, 00:37 am
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;