Cargando



Mysql avanzado - Programación de Triggers

Tutorial sobre programación de Triggers a nivel avanzado. Con ejemplos prácticos incluidos.


jun 24 2013 14:58
Profesional
Mysql avanzado - Programación de Triggers

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


MYSQL_TRIGGERS.jpg


Ejecutamos la sentencia SQL y vemos que efectivamente se ha creado el disparador:

MYSQL_TRIGGERS_2.jpg


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');

MYSQL_TRIGGERS_3.jpg


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

¿Te ayudó este Tutorial?


5 Comentarios


Jose Rodriguez
ago 04 2013 06:39
Mas ejemplos!
porfavor necesito ayuda tengo una tabla boletadetalle_tb y una tabla productos_tb y quiero aplicar un trigger lo tengo asi


create TRIGGER `actualizar_stock` AFTER INSERT ON `boletadetalle_tb`
FOR EACH
ROW
UPDATE producto_tb SET pro_cantidad = pro_cantidad - (select bol_cantidad from boletadetalle_tb) where pro_codigo= new.pro_codigo

pero a lo q ejecuto me sale un error de que afecta a mas de una fila this affects more than 1 row .....
Como puedo solucionarlo porfa

Fernando Rodriguez Olivas
jun 13 2014 16:42
que tal he estado buscando un trigger o sintaxis que debo de usar para las salidas de inventario, el chiste es que quiero que al momento de registrar una salida por ejemplo tengo 100 hojas de maquina registro que salieron 101 entonces que alli maneje un tipo de error " error solo tienes 100 en existencia " si me explico?

Julio Arroyo
jun 16 2014 23:15

que tal he estado buscando un trigger o sintaxis que debo de usar para las salidas de inventario, el chiste es que quiero que al momento de registrar una salida por ejemplo tengo 100 hojas de maquina registro que salieron 101 entonces que alli maneje un tipo de error " error solo tienes 100 en existencia " si me explico?


Recomendamos que realicéis preguntas en el area de Realizar Pregunta, ahí podréis recibir ayuda a cualquier problema ;)

Fernando Rodriguez Olivas
jun 25 2014 16:35

Recomendamos que realicéis preguntas en el area de Realizar Pregunta, ahí podréis recibir ayuda a cualquier problema ;)

gracias! esque soy nuevo aquí y apenas le estoy agarrando.
No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X