Introducción a trigger


Los triggers o disparadores, son procedimientos automaticos que se activan despues de una accion, esta accion puede ser un insert, delete o update

se trabaja con dos identificadores que son after (despues de) before (antes de)

Dentro de las condiciones que tienen los triggers esta, que no pueden existir dos o mas after para el insert o para el delete o para el update


El after es el caso mas comun de los triggers, se activa despues de una sentencia y afecta solo tablas distintas a la que lo esta invocando, situacion que no sucede con el before que solo afecta la tabla que lo invoca

la sintaxis general es

delimiter //
create trigger nombre after (insert, delete, update) on tabla
for each row //recorre fila por fila (arreglos o matrices)
begin
sentencia sql;
end
//
delimiter ;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Crear un trigguer con el nombre de valorventa que al insertar un articulo realice el siguiente cálculo: 
Calcular el valorventa de la tabla detalle con un incremento del 23% del valorunitario de la tabla articulo

ejemplo

delimiter //
create trigger valorventa after insert on articulo
for each row
begin
update detalle set valorventa = (select valorunitario + (valorunitario * 0.23) from articulo where articulo.codigo = detalle.codigo);
end
//
delimiter ;

Para visualizar los Triggers

show triggers;

+------------+--------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
| Trigger    | Event  | Table    | Statement                                                                                                                                       | Timing | Created | sql_mode                                   | Definer        | character_set_client | collation_connection | Database Collation |
+------------+--------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
| valorventa | INSERT | articulo | begin
update detalle set valorventa = (select valorunitario + (valorunitario * 0.23) from articulo where articulo.codigo = detalle.codigo);
end | AFTER  | NULL    | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | cp850                | cp850_general_ci     | utf8_general_ci    |
+------------+--------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
1 row in set (0.05 sec)


MariaDB [subconsultas]> 
insert into articulo values('450','Secador Remington 1600',10,250000,0);
   
Query OK, 1 row affected (0.03 sec)

MariaDB [subconsultas]> select * from detalle;
+----+------------+------------+----------+------------+-------+--------+
| id | nrofactura | fecha      | cantidad | valorventa | total | codigo |
+----+------------+------------+----------+------------+-------+--------+
|  1 | 1200       | 2010-01-30 |        3 |    1168500 |     0 | 150    |
|  2 | 1250       | 2010-02-13 |        5 |    1168500 |     0 | 150    |
|  3 | 1250       | 2010-02-13 |        7 |     922500 |     0 | 250    |
|  4 | 1300       | 2010-03-02 |        1 |    1205400 |     0 | 350    |
|  5 | 1300       | 2010-03-02 |        2 |     135300 |     0 | 300    |
|  6 | 1400       | 2010-03-11 |        3 |    1476000 |     0 | 200    |
|  7 | 1500       | 2010-03-21 |        5 |     922500 |     0 | 250    |
+----+------------+------------+----------+------------+-------+--------+
7 rows in set (0.00 sec)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Crear un trigguer con el nombre de actualizar_existenciap que al insertar un detalle realice el sigueinte cálculo
calcular las existencias segun la tabla detalle de cada articulo

delimiter //
create trigger actualizar_existenciap after insert on detalle
for each row
begin
update articulo set existencia = cantidad - (select sum(cantidad) from detalle where detalle.codigo = articulo.codigo);
end
//
delimiter ;

MariaDB [subconsultas]> show triggers;
+------------------------+--------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
| Trigger                | Event  | Table    | Statement                                                                                                                                       | Timing | Created | sql_mode                                   | Definer        | character_set_client | collation_connection | Database Collation |
+------------------------+--------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
| valorventa             | INSERT | articulo | begin
update detalle set valorventa = (select valorunitario + (valorunitario * 0.23) from articulo where articulo.codigo = detalle.codigo);
end | AFTER  | NULL    | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | cp850                | cp850_general_ci     | utf8_general_ci    |
| actualizar_existenciap | INSERT | detalle  | begin
update articulo set existencia = cantidad - (select sum(cantidad) from detalle where detalle.codigo = articulo.codigo);
end               | AFTER  | NULL    | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | cp850                | cp850_general_ci     | utf8_general_ci    |
+------------------------+--------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
2 rows in set (0.02 sec)
r


MariaDB [subconsultas]> 

insert into detalle(nrofactura,fecha,cantidad,valorventa,total,codigo) values('2001','2020-08-29',1,0,0,450);

Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [subconsultas]> select * from detalle;
+----+------------+------------+----------+------------+-------+--------+
| id | nrofactura | fecha      | cantidad | valorventa | total | codigo |
+----+------------+------------+----------+------------+-------+--------+
|  1 | 1200       | 2010-01-30 |        3 |    1168500 |     0 | 150    |
|  2 | 1250       | 2010-02-13 |        5 |    1168500 |     0 | 150    |
|  3 | 1250       | 2010-02-13 |        7 |     922500 |     0 | 250    |
|  4 | 1300       | 2010-03-02 |        1 |    1205400 |     0 | 350    |
|  5 | 1300       | 2010-03-02 |        2 |     135300 |     0 | 300    |
|  6 | 1400       | 2010-03-11 |        3 |    1476000 |     0 | 200    |
|  7 | 1500       | 2010-03-21 |        5 |     922500 |     0 | 250    |
|  8 | 2000       | 0000-00-00 |        1 |          0 |     0 | 450    |
+----+------------+------------+----------+------------+-------+--------+
8 rows in set (0.00 sec)

MariaDB [subconsultas]> select * from articulo;
+--------+------------------------+----------+---------------+------------+
| codigo | articulo               | cantidad | valorunitario | existencia |
+--------+------------------------+----------+---------------+------------+
| 150    | nevera                 |       25 |        950000 |         17 |
| 200    | televisor              |       11 |       1200000 |          8 |
| 250    | estufa                 |       30 |        750000 |         18 |
| 300    | ventilador             |       17 |        110000 |         15 |
| 350    | lavadora               |       13 |        980000 |         12 |
| 450    | Secador Remington 1600 |       10 |        250000 |          9 |
+--------+------------------------+----------+---------------+------------+
6 rows in set (0.00 sec)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&