Uso Avanzado de Triggers en MySQL utilizando la Base de Datos «Comisaria»

Los triggers en MySQL son una característica poderosa que permite la ejecución automática de una secuencia de comandos SQL en respuesta a ciertos eventos en una tabla. En este artículo, abordaremos el uso avanzado de triggers utilizando la base de datos de una comisaría como ejemplo.

Creación de la Base de Datos y Tablas

Comenzamos con la creación de la base de datos y las tablas necesarias para nuestro ejemplo:

CREATE DATABASE Comisaria;
USE Comisaria;

-- Tabla de agentes
CREATE TABLE Agentes (
    id_agente INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(50) NOT NULL,
    rango VARCHAR(30),
    salario DECIMAL(10, 2) NOT NULL,
    fecha_ingreso DATE
);

-- Tabla de ciudadanos
CREATE TABLE Ciudadanos (
    id_ciudadano INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(50) NOT NULL,
    direccion VARCHAR(100),
    telefono VARCHAR(15)
);

-- Tabla de casos
CREATE TABLE Casos (
    id_caso INT AUTO_INCREMENT PRIMARY KEY,
    descripcion TEXT,
    fecha_inicio DATE,
    estado VARCHAR(20),
    id_agente INT,
    FOREIGN KEY (id_agente) REFERENCES Agentes(id_agente)
);

-- Tabla de reportes
CREATE TABLE Reportes (
    id_reporte INT AUTO_INCREMENT PRIMARY KEY,
    id_caso INT,
    id_ciudadano INT,
    descripcion TEXT,
    fecha_reporte DATE,
    FOREIGN KEY (id_caso) REFERENCES Casos(id_caso),
    FOREIGN KEY (id_ciudadano) REFERENCES Ciudadanos(id_ciudadano)
);

-- Insertar datos en la tabla Agentes
INSERT INTO Agentes (nombre, rango, salario, fecha_ingreso) VALUES
('Juan Pérez', 'Sargento', 45000.00, '2015-06-23'),
('Ana Gómez', 'Teniente', 50000.00, '2018-09-15'),
('Carlos López', 'Cabo', 40000.00, '2020-01-10');

-- Insertar datos en la tabla Ciudadanos
INSERT INTO Ciudadanos (nombre, direccion, telefono) VALUES
('Pedro Martínez', 'Calle Falsa 123', '555-1234'),
('María Fernández', 'Avenida Siempre Viva 742', '555-5678'),
('Luis García', 'Boulevard Central 456', '555-8765');

-- Insertar datos en la tabla Casos
INSERT INTO Casos (descripcion, fecha_inicio, estado, id_agente) VALUES
('Robo en tienda', '2022-03-10', 'Abierto', 1),
('Asalto a mano armada', '2022-04-22', 'Cerrado', 2),
('Vandalismo en parque', '2022-05-15', 'En Proceso', 3);

-- Insertar datos en la tabla Reportes
INSERT INTO Reportes (id_caso, id_ciudadano, descripcion, fecha_reporte) VALUES
(1, 1, 'Robo de mercancía en tienda', '2022-03-10'),
(2, 2, 'Asalto a mano armada en banco', '2022-04-22'),
(3, 3, 'Daños en parque público', '2022-05-15');

Triggers Avanzados en MySQL

Auditoría de Cambios

Uno de los usos avanzados de los triggers es la auditoría de cambios en las tablas. Esto es útil para mantener un registro de quién hizo qué cambios y cuándo.

CREATE TABLE Auditoria (
    id_auditoria INT AUTO_INCREMENT PRIMARY KEY,
    id_usuario INT,
    accion VARCHAR(50),
    fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    detalles TEXT
);

CREATE TRIGGER after_update_agentes
AFTER UPDATE ON Agentes
FOR EACH ROW
BEGIN
    INSERT INTO Auditoria (id_usuario, accion, detalles)
    VALUES (NEW.id_agente, 'UPDATE', CONCAT('Nombre: ', OLD.nombre, ' -> ', NEW.nombre, ', Rango: ', OLD.rango, ' -> ', NEW.rango));
END;

Este trigger after_update_agentes se activa después de cualquier actualización en la tabla Agentes, registrando los cambios en la tabla Auditoria.

Mantenimiento de Integridad Referencial

Los triggers pueden ser usados para asegurar la integridad referencial más allá de las restricciones de clave externa.

CREATE TRIGGER before_delete_agente
BEFORE DELETE ON Agentes
FOR EACH ROW
BEGIN
    DECLARE caso_count INT;
    SELECT COUNT(*) INTO caso_count FROM Casos WHERE id_agente = OLD.id_agente;

    IF caso_count > 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No se puede eliminar el agente porque está asignado a casos.';
    END IF;
END;

El trigger before_delete_agente previene la eliminación de un agente si este está asignado a algún caso, manteniendo así la integridad de los datos.

Automatización de Procesos

Los triggers también pueden automatizar procesos complejos que deben ocurrir en respuesta a cambios en la base de datos.

CREATE TRIGGER after_insert_reporte
AFTER INSERT ON Reportes
FOR EACH ROW
BEGIN
    DECLARE v_estado VARCHAR(20);

    SELECT estado INTO v_estado FROM Casos WHERE id_caso = NEW.id_caso;

    IF v_estado = 'Cerrado' THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No se pueden agregar reportes a casos cerrados.';
    END IF;

    -- Actualizar el estado del caso si es necesario
    UPDATE Casos
    SET estado = 'En Proceso'
    WHERE id_caso = NEW.id_caso AND estado = 'Abierto';
END;

Este trigger after_insert_reporte se asegura de que no se puedan agregar reportes a casos cerrados y actualiza el estado del caso a «En Proceso» si estaba «Abierto».

Buenas Prácticas y Consideraciones

  1. Optimización de Performance: Los triggers pueden afectar el rendimiento si contienen operaciones complejas o si se disparan con mucha frecuencia. Es importante optimizar el código dentro de los triggers.
  2. Orden de Ejecución: Si múltiples triggers están asociados a la misma tabla y evento, su orden de ejecución no está garantizado. Planifique en consecuencia.
  3. Depuración: La depuración de triggers puede ser complicada, ya que se ejecutan automáticamente. Utilizar registros detallados de auditoría puede ayudar a rastrear y solucionar problemas.

Conclusión

Los triggers en MySQL son una herramienta poderosa que permite la automatización de tareas y el mantenimiento de la integridad de los datos en una base de datos. Con un uso avanzado de triggers, se puede realizar auditoría de cambios, mantener la integridad referencial y automatizar procesos complejos. Sin embargo, es importante tener en cuenta las consideraciones de rendimiento y las buenas prácticas para evitar problemas y asegurar el buen funcionamiento de la base de datos.

person encoding in laptop
Photo by Lukas on Pexels.com
error: Content is protected !!

Descubre más desde InfoGonzalez - Blog de formador e informático

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo

Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad
Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.