Avisar de contenido inadecuado

Clasulas, fechas y ordenadores

{
}

 

Una de las preguntas más frecuentes es ¿Cómo puedo saber quién cambió o eliminó una fila? ... Con un trabajo exhaustivo de auditoría sobre la base de datos, o gastando una buena cantidad de tiempo examinando los archivos de registro de MySQL para ver cuando se ejecutó dicha sentencia.

Podemos asignar un trigger a una tabla que se dispare después (AFTER) de una sentencia DELETE o UPDATE, que guarde los valores del registro, así como alguna otra información de utilidad en una tabla de log.

Vamos a examinar un caso práctico, procedemos a ejecutar las siguientes sentencias: CREATE TABLE clientes(
id int not null auto_increment,
nombre varchar(100),
ejecutivo_cuenta varchar(10),
PRIMARY KEY(id),
KEY(nombre)
) ENGINE = InnoDB;

INSERT INTO clientes (nombre, ejecutivo_cuenta) VALUES
('Fredericks','Jaime'),
('Walmart','Mario'),
('Radioshack','Mario'),
('Acme','Juan'),
('Smallco','Jaime');

Ahora tenemos una tabla clientes que guarda la información de clientes y el ejecutivo de cuenta asignado. Cualquiera sabe que la gente de ventas son seres capaces de hacer cualquier cosa por sus intereses y nosotros como administradores de base de datos estamos hartos de las llamadas continuas del departamento de ventas para preguntarnos "QUIEN CAMBIÓ EL EJECUTIVO DE CUENTA DE ESTA COMPAÑIA" !?, y por supuesto involucrarnos en la tarea de descubrir quién cambió los datos.

Es momento de emplear un trigger que venga a nuestro rescate!. Lo primero es crear una tabla simple de log/auditoría: CREATE TABLE auditoria_clientes
(
id int not null auto_increment,
nombre varchar(100),
anterior_ejecutivo_cuenta varchar(10),
usuario varchar(40),
cambiado datetime,
primary key(id)
) ENGINE = InnoDB;

Y ahora crearemos un trigger que vaya llenando los registros de esta tabla cada vez que alguién ejecute una actualización sobre la tabla. Para crear triggers utilizamos la sentencia CREATE TRIGGER: CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON clientes
FOR EACH ROW
BEGIN
INSERT INTO auditoria_clientes(nombre, anterior_ejecutivo_cuenta, usuario, cambiado)
VALUES (OLD.nombre, OLD.ejecutivo_cuenta, CURRENT_USER(), NOW() );
END;

Nota: Para los ejemplos presentados se usará la versión 5.0 más reciente al momento de escribir este artículo, en concreto, la 5.0.10.

Veamos que sucede cuando alguno de los usuarios cambia un registro de la tabla clientes. Por ejemplo, si de una manera "tramposa" Mario quiere hacerse de la cuenta de "Acme", y ejecuta una sentencia de actualización como esta: UPDATE clientes SET ejecutivo_cuenta='Mario' WHERE nombre='Acme'
La codicia de Mario lo supera (o necesita urgentemente dinero para un ingerto de cabello). El piensa que es el vendedor más grandioso desde que Billy vendió su software, y desea hacer de "Acme" uno de sus clientes. Veamos que sucede cuando Mario realiza la actualización (UPDATE). mysql> UPDATE clientes SET ejecutivo_cuenta='Mario' WHERE nombre='Acme';

mysql> SELECT * FROM auditoria_clientes; /* ver nota */
+----+--------+---------------------------+-----------------+---------------------+
| id | nombre | anterior_ejecutivo_cuenta | usuario | cambiado |
+----+--------+---------------------------+-----------------+---------------------+
| 1 | Acme | Juan | Mario@localhost | 2006-01-10 21:59:37 |
+----+--------+---------------------------+-----------------+---------------------+

 

{
}
{
}

Deja tu comentario Clasulas, fechas y ordenadores

Identifícate en OboLog, o crea tu blog gratis si aún no estás registrado.

Avatar Tu nombre