En PL/pgSQL, los conceptos de conteo, registro y triggers son fundamentales para automatizar y optimizar la gestión de datos en una base de datos. A continuación, exploramos cada uno con ejemplos prácticos:
1. Conteo en PL/pgSQL
El conteo se utiliza para obtener el número de registros en una tabla o como resultado de una consulta específica.
Ejemplo 1: Conteo básico en un procedimiento
Un procedimiento que devuelve la cantidad de usuarios en una tabla:
CREATE PROCEDURE contar_usuarios()
LANGUAGE plpgsql
AS $$
DECLARE
total_usuarios INT;
BEGIN
SELECT COUNT(*) INTO total_usuarios FROM usuarios;
RAISE NOTICE 'Total de usuarios: %', total_usuarios;
END;
$$;
Uso:
CALL contar_usuarios();
Ejemplo 2: Conteo condicional
Un procedimiento que cuenta usuarios por un rango de edad:
CREATE PROCEDURE contar_usuarios_por_edad(edad_min INT, edad_max INT)
LANGUAGE plpgsql
AS $$
DECLARE
total INT;
BEGIN
SELECT COUNT(*) INTO total
FROM usuarios
WHERE edad BETWEEN edad_min AND edad_max;
RAISE NOTICE 'Usuarios entre % y % años: %', edad_min, edad_max, total;
END;
$$;
Uso:
CALL contar_usuarios_por_edad(18, 30);
2. Registro en PL/pgSQL
Registrar eventos, cambios o errores en tablas de auditoría es una práctica común en bases de datos.
Ejemplo: Procedimiento de registro
Este procedimiento registra operaciones realizadas por los usuarios en una tabla de auditoría.
CREATE TABLE auditoria (
id SERIAL PRIMARY KEY,
usuario TEXT,
operacion TEXT,
fecha TIMESTAMP DEFAULT NOW()
);
CREATE PROCEDURE registrar_operacion(usuario TEXT, operacion TEXT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO auditoria (usuario, operacion) VALUES (usuario, operacion);
RAISE NOTICE 'Operación registrada: Usuario % realizó %', usuario, operacion;
END;
$$;
Uso:
CALL registrar_operacion('admin', 'inserción de datos');
3. Triggers en PL/pgSQL
Los triggers (disparadores) son funciones que se ejecutan automáticamente en respuesta a eventos (INSERT, UPDATE, DELETE) en una tabla.
Sintaxis básica para un trigger
Un trigger necesita una función asociada:
- Crear la función del trigger.
- Asociar la función al evento mediante
CREATE TRIGGER.
Ejemplo 1: Trigger de registro de cambios
Registrar automáticamente cada actualización de una tabla usuarios en la tabla auditoria.
Crear la función del trigger:
CREATE OR REPLACE FUNCTION registrar_cambio()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO auditoria (usuario, operacion)
VALUES (OLD.nombre, 'Actualización');
RETURN NEW;
END;
$$;
Asociar el trigger:
CREATE TRIGGER trigger_registro_cambios
AFTER UPDATE ON usuarios
FOR EACH ROW
EXECUTE FUNCTION registrar_cambio();
Efecto: Cada vez que se actualice un registro en usuarios, se añadirá una entrada en auditoria.
Ejemplo 2: Evitar bajas de usuarios con permisos especiales
Prevenir la eliminación de usuarios con el rol admin.
Crear la función del trigger:
CREATE OR REPLACE FUNCTION evitar_eliminar_admin()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
IF OLD.rol = 'admin' THEN
RAISE EXCEPTION 'No se puede eliminar un administrador.';
END IF;
RETURN OLD;
END;
$$;
Asociar el trigger:
CREATE TRIGGER trigger_prevenir_eliminacion
BEFORE DELETE ON usuarios
FOR EACH ROW
EXECUTE FUNCTION evitar_eliminar_admin();
Ejemplo 3: Actualización automática de conteos
Actualizar el conteo total de usuarios activos en una tabla estadisticas tras cada inserción en la tabla usuarios.
Tabla de estadísticas:
CREATE TABLE estadisticas (
id SERIAL PRIMARY KEY,
total_usuarios INT DEFAULT 0
);
Crear la función del trigger:
CREATE OR REPLACE FUNCTION actualizar_conteo()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE estadisticas
SET total_usuarios = total_usuarios + 1
WHERE id = 1;
RETURN NEW;
END;
$$;
Asociar el trigger:
CREATE TRIGGER trigger_actualizar_conteo
AFTER INSERT ON usuarios
FOR EACH ROW
EXECUTE FUNCTION actualizar_conteo();
Efecto: Cada vez que se agregue un usuario, se incrementará automáticamente el conteo en estadisticas.
Ventajas del uso de Triggers en PL/pgSQL
- Automatización: Ejecución de procesos automáticos ante eventos en la base de datos.
- Integridad: Garantizan consistencia en los datos.
- Auditoría: Facilitan el registro de cambios en las tablas.
- Reducción de lógica en la aplicación: Centralizan las reglas de negocio en la base de datos.
PL/pgSQL ofrece herramientas poderosas como triggers, funciones y procedimientos para manejar conteos, auditoría y automatización de tareas, optimizando así el flujo de datos y mejorando la confiabilidad del sistema.