Salta el contingut

Fonaments de l'automatització

Per què automatitzar?

Gestionar una base de dades en producció implica moltes tasques repetitives: netejar registres antics, actualitzar estadístiques, verificar integritat referencial, generar informes nocturns, arxivar dades, enviar alertes... Fer-ho manualment comporta:

  • Inconsistència: cada operador pot fer-ho de manera diferent.
  • Oblit: una tasca manual pot no executar-se en el moment crític.
  • Errors humans: la fatiga i les distraccions provoquen errors en scripts llargs.
  • Dependència de persones: si l'operador no hi és, la tasca no es fa.

L'automatització elimina aquests riscos movent la lògica i la planificació al propi SGBD.

Beneficis principals

mindmap
  root((Automatització SGBD))
    Consistència
      Mateixos resultats sempre
      Lògica centralitzada
      Sense variació humana
    Rendiment
      Execució al servidor
      Menys tràfic de xarxa
      Plans d'execució optimitzats
    Seguretat
      Control d'accés granular
      Ocultació de lògica
      Audit trails automàtics
    Manteniment
      Tasques nocturnes
      Arxivat automàtic
      Neteja periòdica
    Reutilització
      Un cop definit, usat moltes vegades
      Menys codi a l'aplicació
      Estandardització

Visió general dels mecanismes d'automatització

En aquest bloc estudiem quatre mecanismes principals disponibles en els SGBD relacionals més importants:

1. Procediments emmagatzemats (Stored Procedures)

Blocs de codi SQL i lògica de control (IF, WHILE, FOR...) que s'emmagatzemen compilats al servidor. S'executen amb una crida explícita (CALL o EXEC). Ideals per a operacions complexes de múltiples passos: validar dades, inserir en diverses taules, calcular totals, gestionar transaccions.

2. Funcions d'usuari (User-Defined Functions)

Similars als procediments però retornen un valor i es poden usar directament en expressions SQL (SELECT, WHERE, ORDER BY). Hi ha funcions escalars (retornen un valor únic) i de taula (retornen un conjunt de files).

3. Disparadors (Triggers)

Codi que s'executa automàticament en resposta a un esdeveniment de dades: INSERT, UPDATE o DELETE. No cal cridar-los explícitament. S'utilitzen per auditoria, validació de regles de negoci, manteniment de dades derivades i sincronització de taules.

4. Esdeveniments programats (Scheduled Events / Jobs)

Mecanismes per executar codi SQL de manera planificada en el temps: cada nit a les 2:00, cada hora, els diumenges... Equivalen als cron jobs del sistema operatiu però integrats al SGBD. Cada motor té el seu propi sistema: pg_cron (PostgreSQL), EVENT SCHEDULER (MySQL), SQL Server Agent (SQL Server), DBMS_SCHEDULER (Oracle).


Comparativa de suport entre motors

Característica PostgreSQL MySQL/MariaDB SQL Server Oracle
Stored Procedures Sí (PL/pgSQL) Sí (T-SQL) Sí (PL/SQL)
Funcions escalars
Funcions de taula No (limitat) Sí (pipelined)
Triggers BEFORE/AFTER AFTER/INSTEAD OF
Triggers FOR EACH ROW FOR EACH STATEMENT
Events/Jobs integrats pg_cron (ext.) EVENT SCHEDULER SQL Server Agent DBMS_SCHEDULER
Gestió d'excepcions EXCEPTION DECLARE HANDLER TRY/CATCH EXCEPTION
Llenguatge procedural PL/pgSQL SQL/PSM T-SQL PL/SQL

Miniactivitat — AC0377/04/01

Miniactivitat — AC0377/04/01 · Procediment Hello World als 4 motors

Escriu i executa, en contenidors Docker dels 4 motors, un procediment emmagatzemat equivalent que rebi un nom com a paràmetre d'entrada i retorni (via SELECT o paràmetre de sortida) el text 'Hola, <nom>! Avui és <data actual>.'.

CREATE OR REPLACE PROCEDURE hola_mon(IN p_nom TEXT)
LANGUAGE plpgsql AS $$
BEGIN
    RAISE NOTICE 'Hola, %! Avui és %.', p_nom, CURRENT_DATE;
END;
$$;
CALL hola_mon('Joan');
DELIMITER $$
CREATE PROCEDURE hola_mon(IN p_nom VARCHAR(50))
BEGIN
    SELECT CONCAT('Hola, ', p_nom, '! Avui és ', CURDATE(), '.') AS missatge;
END $$
DELIMITER ;
CALL hola_mon('Joan');
CREATE PROCEDURE hola_mon @nom NVARCHAR(50)
AS
BEGIN
    SELECT CONCAT('Hola, ', @nom, '! Avui és ', CONVERT(VARCHAR, GETDATE(), 103), '.') AS missatge;
END;
GO
EXEC hola_mon @nom = 'Joan';
CREATE OR REPLACE PROCEDURE hola_mon(p_nom IN VARCHAR2) IS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Hola, ' || p_nom || '! Avui és ' || TO_CHAR(SYSDATE, 'DD/MM/YYYY') || '.');
END;
/
SET SERVEROUTPUT ON;
EXEC hola_mon('Joan');

Anàlisi de diferències sintàctiques: un cop els 4 procediments funcionen, respon:

  1. Quin motor et deixa cridar el procediment amb CALL i quin amb EXEC?
  2. Com es declara el paràmetre d'entrada a cadascun (posició respecte al nom del procediment, tipus)?
  3. Com "retorna" cada motor el resultat: RAISE NOTICE, un SELECT, o DBMS_OUTPUT? Quina diferència pràctica té per a una aplicació que ha de llegir el resultat?
  4. Quin delimitador especial necessites (DELIMITER, GO, /) i per què creus que cada motor l'exigeix?

Omple una taula-resum de les 4 diferències sintàctiques trobades.

Temps estimat: 40 minuts.