Una “tabla de históricos” (o comunmente llamada “de auditoría”) almacena todas las operaciones de base de datos (adición, modificación y borrado) que se realizan sobre otra tabla. De este modo, en caso de error o pánico, se puede volver a una versión anterior y también encontrar al causante del problema.
Como he leído por ahí, existen tantas formas de manejar tablas de auditorías como desarrolladores. A mi personalmente la que me gusta es la descrita aquí. Utiliza una característica de postgres (RECORDS) para almacenar en sendos campos todo el contenido de los registros afectados antes y después de cada operación. Esto ofrece varias ventajas:
- Modificaciones futuras a las estructura de la tabla no requieren modificaciones a la tabla de auditoria.
- Sigue siendo accesible el contenido de cada campo individual en los registros, gracias a que postgres que permite acceder a los subcampos con la sintaxis
(tabla.campo_registro).campo.
Así pues, para cada tabla que queremos auditar necesitamos:
- Crear la tabla de auditoria
- Crear la función que actualice los datos en la tabla de auditoria
- Crear un trigger que dispare la función anterior cuando se produzcan cambios en la tabla original
Sería fantástico tener un código que generase esto automáticamente para una tabla y, tras pegarme trompazos contra los mismos problemas que han tenido otros (aquí y aquí), he dado con un método sencillo que funciona. Se trata de generar tanto la tabla de auditoría, como la función y el trigger de forma dinámica.
Adjunto el código por si le puede servir a alguien: código plpgsql para audit-log