Un disparado (Triggers) es un objeto dentro de la base de datos que ejecuta una acción cuando se ha producido una operación o evento en la base de datos.
Ejemplo cuando se venda un ticket de entrada, descontamos una localidad disponible.
El codigo generico es
CREATE TRIGGER nombredisparador
{ BEFORE | AFTER }
// Se ejecutara antes o despues del evento
{ INSERT | UPDATE | DELETE }
//accion o evento que dispara el trigger
ON nombretabla
// nombre de la tabla que afecto el evento
FOR EACH ROW
sentencia sql que sera ejecutada
Creamos el ejemplo de venta de tickets para un evento o producto en stock. Para probar esto se puede utilizar phpmyadminn o cualquier software que soporte procedimientos almacenados y triggers.
Creamos la base de datos
CREATE DATABASE `ventas`
Creamos 2 tablas
La tabla par almacenar los ticket vendidos
CREATE TABLE `tickets` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`idevento` int(11) NOT NULL,
`nroticket` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
La tabla para almacenar el la disponibilidad de tickets para un determinado evento
CREATE TABLE IF NOT EXISTS `stock` (
`idevento` int(10) NOT NULL,
`stockactual` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `eventos` (
`idevento` int(10) NOT NULL AUTO_INCREMENT,
`evento` int(11) varchar(200),
`fecha` date NOT NULL,
PRIMARY KEY (`idevento`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Creamos el trigger como una consulta sql, en este caso usamos el software gratuito HEIDISQL, la sentencia NEW.nombre_column
a indica que campo de la operación disparadora vamos a utilizar en la ejecución en este caso idevento, si hubiese más los utilizo siempre con NEW delante,
CREATE TRIGGER `actualizar_stock` AFTER INSERT ON `tickets`
FOR EACH
ROW
UPDATE stock SET stockactual = stockactual -1 WHERE idevento = NEW.idevento
Ejecutamos la sentencia SQL y vemos que efectivamente se ha creado el disparador:
A modo de ejemplo insertamos en la tabla stock de 500 tickets disponible para un evento, aquí no habrá respuesta del disparador ya que lo creamos para ejecutarse si se produce una inserción en la tabla tickets.
INSERT INTO `ventas`.`stock` (`idevento` ,`stockactual`) VALUES ('1', '500');
Ahora vamos a probar la magia de los disparadores
Supongamos que vendemos el ticket numero 100 para el evento 1 e insertamos la venta en la base de datos tickets
INSERT INTO tickets (idevento ,nroticket ) VALUES ( '1', '100');
Observemos que ocurrió en la tabla stock y veremos que el stock para este evento ahora tiene 499 ticket disponibles, porque la inserción en la tabla ticket disparo y ejecuto el tigger actualiza_stock.
La utilización de esta metodología permite transparencia de ejecución tanto al usuario como al programador, sabiendo que una acción se ejecutara si otra la dispara y así evitar tareas rutinaria como actualizar un stock en caso de ventas, imagínate esto si la venta es un mercado con miles de producto, vemos como con pocas lineas de código solucionamos un gran problema.
Otro ejemplo podría ser dar de baja un producto del almacén y eliminar el stock
CREATE TRIGGER `Baja_productos` AFTER DELETE ON `productos`
FOR EACH
DELETE FROM stock WHERE idproducto=NEW.idproducto
ROW
Las posibilidades son infinitas y se puede profundizar mucho en situaciones mas complejas, los disparadores o triggers son un gran complemento de los procedimientos almacenados