
Log en una base de datos
29 diciembre 2010Bueno para tener un log mas menos sofisticado dentro de nuestra base de datos, por lo general en las empresas manejan estados lógicos de sus registros, donde por ejemplo una tabla llamada correo puede tener los siguientes campos:
| COR_ID | PK |
| USU_ID | FK_USUARIO |
| COR_COR_ID | FK_CORREO |
| COR_DESCRIPCION | |
| COR_FECHA_INICIO | |
| COR_FECHA_TERMINO | |
| COR_QRY | ESTADO |
Como podemos ver, tenemos la llave primaria de la tabla, donde a su vez podemos ver dos llaves foráneas, la primera hace referencia a la tabla usuario y la segunda hace referencia a la misma tabla, finalmente tenemos un campo llamado COR_QRY donde en él manejo los estados del registro, que pueden ser los siguientes:
I : fila insertada
U: fila actualizada
D: fila eliminada
Por lo tanto cada vez que realice una modificación de la fila cambiare el estado de ella por “U” y crearé una nueva fila con estado “I” con los nuevos valores que se modificaron, donde además agregaré el id de la fila anterior para poder saber cuáles fueron los valores anteriores.
Veamos un ejemplo práctico:
| COR_ID | USU_ID | COR_COR_ID | COR_DESCRIPCION | COR_FECHA_INICIO | COR_FECHA_TERMINO | COR_QRY |
| 1 | 2 | hola@angerrising.cl | 29/12/2010 | 30/12/2010 | U | |
| 2 | 2 | 1 | testing@angerrising.cl | 30/12/2010 | 31/12/2010 | U |
| 3 | 2 | 2 | chao@angerrising.cl | 31/12/2010 | I | |
| 4 | 1 | otro@angerrising.cl | 31/12/2010 | I |
Por lo tanto si quisiéramos luego mostrar el log de algun correo, debo tomar el id de algún correo en estado “I” (se asume que esa es la ultima actualización del registro) y comenzar a ver cuáles son sus antepasados, para ello ejecuto la siguiente query (sobre Oracle):
select level, c.* from correo c
START WITH COR_ID = 96
CONNECT BY PRIOR COR_COR_ID like cor_id
ORDER BY COR_ID
y nos mostrara como resultado lo siguiente:
| LEVEL | COR_ID | USU_ID | COR_COR_ID | COR_DESCRIPCION | COR_FECHA_INICIO | COR_FECHA_TERMINO | COR_QRY |
| 3 | 1 | 2 | hola@angerrising.cl | 29/12/2010 | 30/12/2010 | U | |
| 2 | 2 | 2 | 1 | testing@angerrising.cl | 30/12/2010 | 31/12/2010 | U |
| 1 | 3 | 2 | 2 | chao@angerrising.cl | 31/12/2010 | I |
Bueno esto es considerado una buena práctica al momento que nos realicen una auditoria en caso de que se hayan realizado cambios malintencionados sobre la integridad de los datos o si tan solo queremos mantener históricos de algo especifico, incluso tb sirve si queremos organizar jerarquías donde podemos ver un ejemplo de ello en este sitio, espero que les haya gustado y/o servido, saludos.


