INF-272 TALLER DE BASE DE DATOS MySQL
____________________________________________________________________________
TRIGGERS en MySQL
Estructura de un trigger
CREATE
[DEFINER = usuario]
TRIGGER [IF NOT EXISTS] nombre_trigger
{ BEFORE | AFTER } { INSERT | UPDATE | DELETE }
ON nombre_tabla FOR EACH ROW
[{ FOLLOWS | PRECEDES } otro_trigger]
BEGIN
declaraciones(cuerpo del trigger)
END
EJEMPLO 1
Crear un disparador que guarde el puntaje Final de cada equipo por
cualquier actualización en los puntos que gana por competencia
almacenados en la tabla realiza.
INF-272 TALLER DE BASE DE DATOS MySQL
____________________________________________________________________________
SOLUCIÓN
Puntaje Final = Suma (Puntos)
DELIMITER //
CREATE TRIGGER t_realiza_upd_puntos AFTER UPDATE ON realiza
FOR EACH ROW
BEGIN
DECLARE pf double;
SELECT SUM(puntos)into pf
FROM realiza
WHERE codEquipo = [Link];
UPDATE equipo
SET puntajeFinal = pf
WHERE codEquipo = [Link];
END//
DELIMITER ;
INF-272 TALLER DE BASE DE DATOS MySQL
____________________________________________________________________________
TABLAS PREVIAS A LA EJECUCIÓN
Tabla realiza
Tabla equipo
EJECUCIÓN (ACTUALIZACIÓN DE UN REGISTRO)
UPDATE realiza
SET puntos = 90
WHERE codEquipo = 1001
AND codCompetencia = 2;
TABLAS POSTERIORES A LA EJECUCIÓN
Tabla realiza
Tabla equipo
INF-272 TALLER DE BASE DE DATOS MySQL
____________________________________________________________________________
EJEMPLO 2
Crear una tabla que guarde el historial de las actualizaciones hechas en
la tabla persona, cada registro de la nueva tabla debe contener los
mismos campos de la tabla persona con la adición de una nueva columna
la cual guardará la fecha de la modificación.
SOLUCIÓN
Creación de la tabla histo_persona.
CREATE TABLE IF NOT EXISTS `bdcampamento`.`histo_persona` (
`ci` INT NOT NULL,
`exp` VARCHAR(10) NOT NULL,
`apellidoPaterno` VARCHAR(50) NOT NULL,
`apellidoMaterno` VARCHAR(50) NOT NULL,
`nombre` VARCHAR(50) NOT NULL,
`fechaNacimiento` DATE NOT NULL,
`sexo` VARCHAR(10) NOT NULL,
`fechamodi` DATE NOT NULL
)
ENGINE = InnoDB;
Creación del trigger t_histo_persona.
DELIMITER //
CREATE TRIGGER `t_histo_persona` AFTER UPDATE ON `persona`
FOR EACH ROW BEGIN
INSERT INTO histo_persona
VALUES (
[Link],
[Link],
[Link],
INF-272 TALLER DE BASE DE DATOS MySQL
____________________________________________________________________________
[Link],
[Link],
[Link],
[Link],
CURDATE()
);
END//
DELIMITER ;
TABLAS PREVIAS A LA EJECUCIÓN
Tabla persona
Tabla histo_persona (está vacía)
EJECUCIÓN (ACTUALIZACIÓN DE UN REGISTRO)
UPDATE persona
SET apellidoPaterno = 'FatherLastName'
WHERE ci = 2005061;
INF-272 TALLER DE BASE DE DATOS MySQL
____________________________________________________________________________
TABLAS POSTERIORES A LA EJECUCIÓN
Tabla persona
Tabla histo_persona