Cargando



Mysql disparadores o trigger - Definiendo eventos y momentos

Lo disparados o trigger son procedimiento escritos en código pl/sql que permiten realizar un evento o tarea en un determinado momento.


ago 08 2013 17:58
Profesional
ago 08 2013 18:01
La sentencia que crea un disparador es

CREATE TRIGGER nombre_trigger  momento  evento ON tabla ON EACH ROW


Momento
Puede ser AFTER o BEFORE osea después o antes de que ocurra un evento sql como crear un registro, borrar, seleccionar, buscar, modificar, etc

Evento
Denominamos evento a cualquiera de las operaciones sql puede ser INSERT, UPDATE o DELETE. Desde los disparadores no se pueden hacer selecciones (Select * from …) esta operación se realiza desde procedimientos almacenados y no desde disparadores.


Sentencias y comandos generales para gestionar triggers o disparadores
Creamos un disparador para auditoria en ventas de una agencia de autos, cada vez que un operador o vendedor modifique los datos de un cliente, automáticamente en una tabla de auditorias_cliente indicaremos la fecha y hora, quien realizo el cambio y cual es el cliente que fue modificado

CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON clientes
FOR EACH ROW
INSERT INTO auditoria_clientes(idcliente, modificado_por,fecha)
VALUES (OLD.idcliente, NEW.idoperador, NOW() )


mysql-triggers.jpg


Consultar todos los disparadores disponibles en la base de datos
Show triggers


mysql-triggers-2.jpg


En este caso el que creamos auditoriaclientes y vemos en distintas columnas su funcionalidad, un evento update en la tabla clientes que hará una inserción y su usuario administrador es root

Borrar un disparador de la base de datos
DROP TRIGGER nombretrigger

Como llamar procedimientos almacenados en un disparador
Analizaremos un ejemplo para una base de datos de productos y que al generar una venta un vendedor también deberá generase la comisión que este gana, entonces se debe actualizar la comisión por venta luego de insertar o generar la nueva venta o también podría ser luego de generar una factura, según el modelo de negocio a desarrollar, pero es suficiente para que se entienda el ejemplo.
Creamos un procedimiento almacenados que calculara la comisión según la cantidad de un producto vendido.

DELIMITER $$

CREATE PROCEDURE pa_comision` (IN p_idvendedor INT, IN p_idproducto INT, IN cantidad INT)
BEGIN
DECLARE totalcomision INT DEFAULT 0;
Select comision from productos where idproducto=p_idproducto;
totalcomision=comision*p_cantidad
insert into comisiones (vendedor, comision) values (idvendedor, idproducto,comision,totalcomision);
END $$
DELIMITER $$

Ahora creamos el trigger o disparador nuevaventa. Este disparador se ejecutara luego de insertada una venta y tomando los datos de esta o del detalle de ventas,.

CREATE TRIGGER nuevaventa AFTER INSERT on ventas
FOR EACH ROW BEGIN

CALL pa_comisiones(new.idvendedor,new.idproducto,new.cantidad);

END$$

Podemos ver que se llama al procedimiento almacenado para poder consultar los datos del producto, la comisión y así poder calcular automáticamente el importe a comisión.

También podríamos hacerlo màs complejo permitiendo saber si la comisión y la venta ya existen entonces modificarla y no volverla a insertar.

Para ello deberíamos reconocer ademas el numero de venta o factura, entonces buscamos si el producto ya existe en el numero de venta y vendedor, implica que ya existe y se comisiono, por lo tanto modificaremos y no insertaremos como nueva venta.

select count(idproducto)>0 into yaexiste from comisiones where idvendedor = idvendedor and idventa=idventa;

if yaexiste then
UPDATE comisiones set comision = totalcomision where idvendedor = idvendedor and idventa=idventa;
else
insert into comisiones (vendedor, comision) values (idvendedor, idproducto,comision,totalcomision);
end if;

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X