Tengo una aplicación que necesita un log visible (y no editable) por los usuarios, básicamente mostrando cada insert/update/delete a las diferentes colecciones de cosas (tablas reales o views), con hora y usuario responsable. Debería manejar eso en otra tabla de postgres? o loggear externamente?
Esta es una aplicación perfecta para el modelo objeto-relacional que ofrece PostgreSQL:
1. Creas una tabla «genérica» de auditoría que tenga al menos cuatro columnas: createdOn, createdBy, updatedOn, updatedBy. Si en tu aplicación tiene sentido: deletedOn, deletedBy. Las columnas 'On' son TIMESTAMP y las columnas 'By' son TEXT para almacenar nombres de usuario. Si estás empleando usuarios de PostgreSQL para autenticar, ya eres un ganador porque puedes usar DEFAULT CURRENT_USER.
2. Escribe un TRIGGER que dependiendo de la operación CRUD actualize las columnas antes mencionadas.
3. Para cualquier tabla que requiera auditoría haces CREATE TABLE foo ( ... ) INHERIT ( tabla_de_auditoría )
4. Para impedir que los usuarios vean el log, puedes usar los permisos granulares por columna. Eso va a requerir que tengas vistas y funciones SETOF que entreguen sólo las partes accesibles a los usuarios regulares.
Puedes aplicar el mismo concepto para tener la tabla particionada según el año y de ser necesario «limpiar» registros viejos que no tengan sentido. Puedes «engañar» al usuario diciendo que hiciste el DELETE y registrándolo en la tabla de auditoría, pero no borrar la(s) fila(s) usando una regla de reescritura de comandos.
Una alternativa es tener una tabla separada para auditoría en la cual registras la tabla cambiada. Aquí no puedes aprovechar la herencia de tablas, y vas a tener una proliferación grosera de triggers para cada tabla, a cambio de que el control de acceso a esa tabla es relativamente más fácil. Prefiero la primera solución.
1. Creas una tabla «genérica» de auditoría que tenga al menos cuatro columnas: createdOn, createdBy, updatedOn, updatedBy. Si en tu aplicación tiene sentido: deletedOn, deletedBy. Las columnas 'On' son TIMESTAMP y las columnas 'By' son TEXT para almacenar nombres de usuario. Si estás empleando usuarios de PostgreSQL para autenticar, ya eres un ganador porque puedes usar DEFAULT CURRENT_USER.
2. Escribe un TRIGGER que dependiendo de la operación CRUD actualize las columnas antes mencionadas.
3. Para cualquier tabla que requiera auditoría haces CREATE TABLE foo ( ... ) INHERIT ( tabla_de_auditoría )
4. Para impedir que los usuarios vean el log, puedes usar los permisos granulares por columna. Eso va a requerir que tengas vistas y funciones SETOF que entreguen sólo las partes accesibles a los usuarios regulares.
Puedes aplicar el mismo concepto para tener la tabla particionada según el año y de ser necesario «limpiar» registros viejos que no tengan sentido. Puedes «engañar» al usuario diciendo que hiciste el DELETE y registrándolo en la tabla de auditoría, pero no borrar la(s) fila(s) usando una regla de reescritura de comandos.
Una alternativa es tener una tabla separada para auditoría en la cual registras la tabla cambiada. Aquí no puedes aprovechar la herencia de tablas, y vas a tener una proliferación grosera de triggers para cada tabla, a cambio de que el control de acceso a esa tabla es relativamente más fácil. Prefiero la primera solución.
Liked by:
Sizz Lorr
Mathias San Miguel
Francisco
+1 answer
Read more