Auditoría de Cambios en Tablas
Existe una manera sencilla de ir manteniendo los cambios históricos de una tabla de forma transparente a la aplicación. Consiste en asociar triggers al alta/baja/modificación de registros de un tabla e ir almacenando los cambios en una tabla paralela en otro esquema de la misma base. A partir de la versión 1.2.0 de Toba hay una clase disponible para crear los triggers, procedimientos almacenados y esquema paralelo al principal.
Creación y Actualización
El primer paso es crear el esquema de triggers y tablas replicadas. Esto se hace con el comando
toba proyecto crear_auditoria -p toba_referencia
Opcionalmente se puede incluir la creación de este esquema en la instalación misma de la aplicación, seleccionando un subconjunto de tablas a auditar. Ver Extensión de la administración.
Una vez ejecutado el comando ya contamos con el esquema de auditoría en la misma base de negocios
Si se realizan cambios en el modelo del negocio, se debe ejecutar nuevamente el comando para tomar estos cambios.
A partir de la version 1.4.0 de Toba la creación del esquema puede realizarse desde dentro del Editor, en la pantalla perteneciente a la configuración de la fuente de datos. Esto se realiza mediante el botón ubicado en la parte inferior derecha de la pantalla, el cual dispara la creación/actualización del esquema de auditoría.
Ejecución
Una vez creado el esquema a medida que se vayan modificando las tablas
originales se van guardando las modificaciones en las tablas de
auditoría. Para que el usuario almacenado en estas tablas refleje el
usuario actual logueado al sistema (y no el usuario con el cual se
conecta a la base que suele ser único por aplicación) es necesario
guardar en una tabla temporal el usuario actual, una forma sencilla de
asegurar esto es extender la fuente de datos y usar la ventana
post_conectar
:
<?php
class toba_referencia_fuente_datos extends toba_fuente_datos
{
/**
* Una vez conectado a la base se crea una tabla temporal conteniendo el usuario actual
*/
function post_conectar()
{
$usuario = toba::usuario()->get_id();
$id_solicitud = toba::instancia()->get_id_solicitud();
if (! isset($usuario)) {
$usuario = 'publico';
}
$sql = 'CREATE TEMP TABLE tt_usuario ( usuario VARCHAR(30), id_solicitud INTEGER);';
$usuario = $this->db->quote($usuario);
$id_solicitud = $this->db->quote($id_solicitud);
$sql .= "INSERT INTO tt_usuario (usuario, id_solicitud) VALUES ($usuario, $id_solicitud)";
$this->db->ejecutar($sql);
}
}
?>
A partir de la version 1.4.0 de Toba se puede configurar esto de dos maneras distintas:
Utilizando el check Auditoría que se visualiza en la imagen anterior. Esto hará que Toba genere automáticamente la tabla temporal antes mencionada luego de realizar la conexión.
Manualmente como en el esquema previo, pero utilizando la nueva API en
toba_fuente_datos
. El cual es más inocuo a futuro.<?php class toba_referencia_fuente_datos extends toba_fuente_datos { /** * Antes de conectarse a la base de datos, le digo que la misma posee esquema de auditoría * De esta forma se creará automáticamente la tabla temporal y se asignará el usuario. */ function pre_conectar() { $this->set_fuente_posee_auditoria(true); } } ?>
Consulta
Existe una operación de consulta de sucesos básica en el proyecto toba_usuarios.