martes, 14 de octubre de 2008

Creando un Trigger en MYSQL


En este pequeño articulo mostraré como crear un trigger (o disparador) en MYSQL que nos indique que usuario a eliminado algún registro de una tabla fabricantes de nuestra base de datos informática (ver en el ítem bases de datos de este bloc).

Aunque son las 1 de la mañana realizaré este manual pues durante la tarde estuve trabajando con un compañero en esto y me di cuenta que los triggers de mysql soportan fácilmente realizar insert con registros por defecto como:

- CURRENT_USER() => Inserta el usuario que realizo la operacción;
- CURRENT_DATE() => Inserta la fecha en que se realizo la operacción;
- CURRENT_TIME() => Inserta la hora en que se realizo la operacción;
- CURRENT_TIMESTAMP() => Inserta la fecha y hora en que se realizo la operacción;

Pero insertar registros como por ejemplo el código o nombre del registro que se elimino (o actualizo) mediante un trigger requiere de una mayor habilidad que espero se aclare ahora.

NOTA: MYSQL no soporta más de 1 trigger en la misma tabla;

Manos a ala obra

Creando las tablas (nota: la base de datos pueden llamarla informática o el nombre que deseen)

Código SQL
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
CREATE TABLE `articulos` (
`CODIGOART` int(11) NOT NULL,
`NOMBRE` varchar(100) default NULL,
`PRECIO` int(11) default NULL,
`CODFRABICANTE` int(11) NOT NULL,
PRIMARY KEY (`CODIGOART`,`CODFRABICANTE`),
KEY `CODFRABICANTE` (`CODFRABICANTE`) )
ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `articulos`
(`CODIGOART`, `NOMBRE`, `PRECIO`, `CODFRABICANTE`)
VALUES
(100, 'MOUSE', 4230, 5),
(101, 'Notebook DELL', 439223, 3),
(102, 'Torre 50 DVD +R', 7110, 1),
(104, 'Base para notebook', 22514, 8),
(105, 'Computador Ensamblado PIV', 178214, 10),
(106, 'Teclado Multimedia PS/2', 4491, 6),
(107, 'Notebook Aspire 5610', 466223, 4),

(108, 'Impresora Laser', 12591, 7),
(109, 'Audifonos y microfono Gamer', 18923, 9),
(110, 'lampara USB notebook', 9000, 5),
(111, 'mouse pad', 891, 10), (112, 'Key PAD', 2691, 1),
(112, 'Limpiador de Pantallas', 4500, 8),

(113, 'Mochila de Notebook', 29723, 6);


CREATE TABLE `fabricantes` (
`CODIGO` int(11) NOT NULL,

`NOMBRE` varchar(100) default NULL,
PRIMARY KEY (`CODIGO`) )
ENGINE=InnoDB DEFAULT CHARSET=latin1;



INSERT INTO `fabricantes` (`CODIGO`, `NOMBRE`)
VALUES
(1, 'Isumos Nacionales y cía.'),
(3, 'Dell Computer Inc.'),
(2, 'HP'),
(4, 'Acer internacional'),
(5, 'Genius'),
(6, 'PC Tronix'),
(7, 'Sony'),
(8, 'Kensignton'),
(9, 'Logitech'),
(10, 'Importadora Nacional');


ALTER TABLE `articulos` ADD CONSTRAINT `articulos_ibfk_1` FOREIGN KEY (`CODFRABICANTE`) REFERENCES `fabricantes` (`CODIGO`) ON DELETE CASCADE ON UPDATE CASCADE;


Bien ya poseemos 2 tablas relacionadas (fabricantes y articulos) ahora crearemos una nueva tabla a la que llamaremos cambios.

CREATE TABLE `cambios` (
`id` int(11) NOT NULL,
`nombre_art` varchar(50) default NULL,
`usuario` varchar(50) default NULL,
`FECHA` TIMESTAMP(0) NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`) )
ENGINE=InnoDB DEFAULT CHARSET=latin1;





En esta tabla guardaremos el id de articulo, el nombre, el usuario, la fecha y hora en que se elimine un registro de la tabla fabricantes.

Creando el Trigger

CREATE TRIGGER `informatica`.`fabricantes_before_ins_tr` BEFORE DELETE ON `informatica`.`fabricantes`
FOR EACH ROW
BEGIN
INSERT INTO cambios SET id = old.CODIGO, nombre_art = old.Nombre, usuario = CURRENT_USER(), fecha = CURRENT_TIMESTAMP;
END;

En este caso he utilizado old pues se trata de un delete en la tabla pero si fuese un update o insert se debe utilizar el alias New.

Ahora solo nos queda eliminar algun registro de la tabla fabricantes y revisar en la tabla cambios como ha quedado almacenda la información.

Nota: Para la creación de trigger hay que poseer atributos de super usuario del motor de bases de datos.

(Si falla revisar los puntos y comas ya que blogger me elimina algunos caracteres especiales al subir la información).

más informacion en wikipedia

x Jlara.

1 comentario:

Anónimo dijo...

Gracias jorge...
siempre salvando y apoyando