Vistas de página en total

9 feb 2014

Desarrollo de una Bitácora usando Triggers en MySQL (Fedora 19)

En el presente material se contemplan 4 etapas las cuales son:

  1. Creación de una Base de Datos (que solo consta de 2 tablas, Artículos y Bitácora. La tabla de bitácora, es la tabla que controlará los procesos u operaciones que se realicen sobre la tabla Artículos (Insertar, Modificar, Eliminar), también se controlará el usuario que realice dichas operaciones, así mismo la Fecha y hora en que realizó alguna operación.).
  2. Creación de un usuario en MySQL (para administrar quien realiza operaciones en la B.D.).
  3. Creación de Triggers (Insertar, Modificar y Eliminar).
  4. Comprobación (en foto-capturas y en video).

Cabe aclarar que el material presentado es de una forma básica y las tablas como las operaciones a registradas en la Bitácora dependerán de la Base de Datos que deseen crear.
Sin mas preámbulo se procede con la primera etapa.



Creación de la B.D Control

1.- Se pasa a abrir una terminal en Fedora y se accede a mysql.

“ mysql -u root -p “



2.- Se pasa a crear la base de datos la cual llevará el nombre de control. Para ello se usa la siguiente instrucción:

“ create database control “



3.- Se accede a la base de datos.

“ use control; “



4.- Se pasa a crear la tabla de Artículos con los siguientes campos: [id_articulo, nombre_articulo, precio].

“ create table articulos (id_articulo int (20) not null primary key, nombre_articulo varchar (20), precio varchar (20))engine=innodb; “



5.- Ahora se crea la tabla de bitácora, por lo cual, se harán uso de los siguientes campos: [id_bitacora, id_articulo, nombre_nuevo, nombre_viejo, precio_nuevo, precio_viejo, usuario, fecha, accion]. Los campos con " _nuevo  y  _viejo ", son usados por si un usuario realiza una modificación sobre los artículos. Esto se explicará más adelante con los Triggers. Ahora bien para crear la tabla Bitácora se hace lo siguiente:

“ create table bitacora (id_bitacora int (30) auto_increment primary key, id_articulo int (20), nombre_nuevo varchar (20), nombre_viejo varchar (20), precio_nuevo varchar (20), precio_viejo varchar (20), usuario varchar (30), fecha datetime, accion varchar (15))engine=innodb;



Ya terminada la base de datos con sus respectivas tablas, se pasan a crear los Triggers, para que se ejecuten a la hora de una inserción, modificación o eliminación sobre la tabla artículos.



Creación de los Triggers

Antes de comenzar a crear los Triggers o disparadores, se explicará la sintaxis que debe de llevar, algo como lo siguiente:

CREATE TRIGGER nombre_trigger BEFORE|AFTER INSERT|UPDATE|DELETE
ON nombre_tabla
FOR EACH ROW
BEGIN
Funcion_del_Trigger

DONDE:

CREATE TRIGGER= instrucción para crear el trigger
nombre_trigger= nombre que se le desee dar al trigger
BEFORE, AFTER = representa la forma de ejecución Antes o Después
INSERT, UPDATE, DELETE = función en la que se ejecutará dicho trigger, (Antes o Después de realizar una inserción, modificación o eliminación.
Nombre_tabla = Nombre de la tabla sobre la que tendrá acción el Trigger.
FOR EACH ROW = Sintaxis de default, para decir que tendrá ejecución para cada uno de los datos de la fila.
BEGIN = Indica el comienzo de la acción, esta instrucción varía dependiendo de la versión de mysql, en versiones antiguas a la versión 5.1 se usa esta instrucción, y en versiones posteriores, se omite.
Funcion_del_Trigger = La tarea que realizará dicho trigger.

Los Triggers en la parte de Funcion_del_Trigger suelen manejar palabras como: NEW. Y OLD. Eso hace referencia a la captura de un dato Nuevo o uno Viejo.

Dicho lo Anterior se pasará a realizar los Triggers.

1.- Primero se creará el Trigger que capture ciertos datos a la hora de insertar un nuevo registro en la tabla de Artículos, dichos datos, se alojarán automaticamente en la tabla de Bitácora. Para ello se crea de la siguiente manera.

“ create trigger insertar after insert
on articulos
for each row
insert into bitacora (id_articulo, nombre_nuevo, precio_nuevo, usuario, fecha, accion) values (new.id_articulo, new.nombre_articulo, new.precio, user(), now(), 'Inserto'); “



NOTA: El Trigger indica que a la hora de realizar el alta de un nuevo artículo, capture en la tabla bitácora, el Id_articulo, nombre_articulo, precio, usuario (user), la fecha y hora (now), y que Insertó un nuevo registro.

2.- Se crea el Trigger de Actualizar.

“ create trigger actualizar after update
on articulos
for each row
insert into bitacora (id_articulo, nombre_nuevo, nombre_viejo, precio_nuevo, precio_viejo, usuario, fecha, accion) values (old.id_articulo, new.nombre_articulo, old.nombre_articulo, new.precio, old.precio, user(), now(), 'Modifico'); “



NOTA: En este Trigger, se almacenan tanto los nombres nuevos como los viejos, así mismo en sus precios, ya que es una actualización, se debe controlar el nombre anterior o su precio anterior, así como quien realizó dicha operación.

3.- Para terminar se crea el Trigger de Eliminar.

“create trigger eliminar after delete
on articulos
for each row
insert into bitacora (id_articulo, nombre_viejo, precio_viejo, usuario, fecha, accion) values (old.id_articulo, old.nombre_articulo, old.precio, user(), now(), 'Elimino'); “



NOTA: Este Trigger tiene como función solo capturar datos viejos por lo cual solo se utilizan los OLD, el New en este Trigger no funciona por sintaxis.



Creación de un Usuario.

Se crea un usuario, para verificar que los disparadores verdaderamente capturen el nombre del usuario.

1.- Se crea el usuario “manuel” para una pequeña comprobación, el usuario será local (localhost), si se desea poner en red, basta con agregar la IP correspondiente a la PC que establecerá conexión Al Servidor.

“ CREATE USER 'manuel'@'localhost' IDENTIFIED BY '123'; “



2.- Se otorgan los respectivos privilegios sobre la base de datos.

“ GRANT ALL ON * . * TO 'manuel'@'localhost' IDENTIFIED BY '123'; “



3.- Se pasan a actualizar los privilegios previamente asignados.

“ flush privileges “





Comprobación

1.- Se abre una terminal, y se pasa a acceder a mysql con el usuario que se creó anteriormente.

“ mysql -u manuel -p ”



2.- Se pasará a acceder a la base de datos control y se insertará un nuevo registro a la tabla artículos, luego se pasará a visualizar la tabla bitácora, para corroborar que si se ejecutó el disparador, con los datos correspondientes a la Inserción del Registro.



2.- Se pasa a modificar el registro anexado y se cambiará el nombre del producto por Lap-top y el precio por $15,000.00, luego se realiza una nueva consulta en bitácora para corroborar que los datos se han almacenado, tanto el nombre y precio nuevo.



3.- Por último se realizará una eliminación, y se debe de almacenar los datos correspondientes en la tabla bitácora.



Con esto queda comprobada la funcionalidad de los disparadores.


Comprobación en video de las instrucciones usadas  anteriormente, para corroborar lo que aquí se expone.



5 comentarios:

MARTIN PAEZ dijo...

saludos tengo una duda si yo utilizo un triggers para crear mi bitacora del sistema como pudiera hacer que me refleje tambien el usuario que a realizado el movimiento, o modificacion pero me refiero al usuario de sesion en mi php

Anónimo dijo...

para eso le tendras que crear a cada usuario un usuario de bd. podras usar usar los mismos datos de usuario y contraseña. para crear los usuarios ejecutas el comando create user desde php. y esos datos del login. y en el login en ves de que consultes si existe el usuario consultaras al useruario y pass de la bd.

MRroberth dijo...

Hola tengo una tabla bitacora la cual cree asi:

create table bitacora (id_bitacora int (30) auto_increment primary key, orden int (4), x_nuevo varchar (20), x_viejo varchar (20), y_nuevo varchar (20), y_viejo varchar (20), usuario varchar (30), host varchar (30), fecha datetime, accion varchar (15))engine=innodb;

a la cual le trato de crear el siguiente trigger:

create trigger bitacora_insertar after insert
on coordenadas2017
for each row
insert into bitacora (norden, x_nuevo, y_nuevo, usuario, host, fecha, accion) values (new.orden, new.x_nuevo, new.y_nuevo, user(), now(), 'INSERTO');


Pero me sale el siguiente error:

ERROR 1054 (42S22): Unknown column 'x_nuevo' in 'NEW'


por favor me pueden ayudar..... dejo mi correo
rhernandez@revoluciondigital.com.mx

MARTIN PAEZ dijo...

yo lo establecerida de esta forma, claro yo lo ago directamente en el ejecutador de sql no se si tu lo haces por terminal en software libre.

DELIMITER $$
CREATE TRIGGER `insertar` BEFORE INSERT ON `personas` FOR EACH ROW insert into bitacora (usuario,operacion,tabla,fecha,registro) values (CURRENT_USER,NEW.usuario,"Inserto","personal",NOW(),NEW.cedula)
$$
DELIMITER ;

a ver te lo explico un poco le digo que si se realiza algún registro o una inserción en la tabla Personal me inserte en la tabla bitácora en los campos de usuario session operación tabla evaluando los valores, con current user me devuelve el usuario, la palabra Inserto que va en operación en tabla va personal porq es la tabla que esta afectando la función now() para que me inserte la fecha y hora del movimiento y en registros va la cédula del registro insertado que me indicara el movimiento especifico que inserto.

el resultado seria :
jose
inserto
personal
19145594
2017-08-05 11:27:05



Anónimo dijo...

Lo voy a tomar pero me ofende muchisimo XD