TRIGGERS
Un Trigger en MySQL es un programa almacenado(stored program), creado para ejecutarse automáticamente cuando ocurra un evento en la base de datos.
- Pueden ser activados antes (BEFORE) o después (AFTER) de la ejecución de un evento
- Los eventos pueden ser: INSERT, UPDATE, DELETE
SINTAXIS
CREATE [DEFINER = {usuario | CURRENT_USER}]
TRIGGER nombre_trigger {BEFORE|AFTER} {UPDATE | INSERT | DELETE}
ON nombre_tabla
FOR EACH ROW
<bloque_de_instrucciones>DEFINER = {usuario | CURRENT_USER}: Indica al gestor de bases de datos qué usuario tiene privilegios en su cuenta, para la invocación de los triggers cuando surjan los eventos DML.
Por defecto esta característica tiene el valor CURRENT_USER que hace referencia al usuario actual que está creando el Trigger.
nombre_del_trigger: Existe una nomenclatura muy práctica para nombrar un trigger, la cual da una mejor legibilidad en la administración de la base de datos.
Primero va el nombre de tabla, luego se usa la inicial del momento de ejecución (AFTER o BEFORE) y seguido de la inicial de la operación DML. Por ejemplo:
autos_AU_trigger
-- AU = After UpdateBEFORE|AFTER: Especifica si el Trigger se ejecuta antes o después del evento DML.
UPDATE|INSERT|DELETE: Indica la sentencia que se usará para que se ejecute el Trigger.
ON nombre_de_la_tabla: En esta sección se establece el nombre de la tabla asociada.
FOR EACH ROW: Establece que el Trigger se ejecute por cada fila en la tabla asociada.
<bloque_de_instrucciones>: Define el bloque de sentencias que el Trigger ejecutará al ser invocado.
EJEMPLOS
(usar la base de datos collectionhw)
- Crear una tabla para almacenar los datos actualizados
CREATE TABLE preciosActualizados (
id INT NOT NULL AUTO_INCREMENT,
sku CHAR(5) NOT NULL,
modelo SMALLINT(6) NOT NULL,
precioViejo DECIMAL(10,2) NOT NULL,
fechaRegistro TIMESTAMP NOT NULL,
PRIMARY KEY (id)
);- Crear un trigger para registrar los autos que actualizaron sus precios
CREATE TRIGGER autos_AU_trigger AFTER UPDATE ON carritos
FOR EACH ROW
INSERT INTO preciosActualizados(sku, modelo, precioViejo, fechaRegistro)
VALUES(old.sku, old.modelo, old.precio, now());