Postgres: creando tablas de históricos automáticamente
Blog
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
Volver