PostgreSQL AVANT les déclencheurs
Les déclencheurs dans PostgreSQL sont des fonctions qui s'exécutent automatiquement en réponse à des événements spécifiques sur un tableau, tels que INSERT, UPDATE, ou DELETE. Un déclencheur `BEFORE` est déclenché avant que l'événement ne se produise, ce qui vous permet de modifier les données ou d'appliquer des contraintes avant que les changements de données ne soient validés.
Utilisation
Les déclencheurs `BEFORE` sont utilisés pour valider ou modifier des données avant qu'elles ne soient insérées, mises à jour ou supprimées dans un tableau. Ils sont souvent utilisés pour appliquer des règles commerciales, valider l'intégrité des données ou mettre à jour automatiquement des champs.
sql
CREATE TRIGGER trigger_name
BEFORE INSERT OR UPDATE OR DELETE
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();
Dans cette syntaxe, le mot-clé `BEFORE` spécifie que le trigger doit être activé avant que le(s) événement(s) spécifié(s) ne se produise(nt). Les déclencheurs `BEFORE` diffèrent des déclencheurs `AFTER`, car les déclencheurs `BEFORE` s'exécutent avant l'événement, permettant la manipulation des données avant que la transaction ne soit finalisée.
Exemples
1. Déclencheur de base BEFORE INSERT
sql
CREATE OR REPLACE FUNCTION check_positive_salary()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.salary < 0 THEN
RAISE EXCEPTION 'Salary cannot be negative';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER check_salary_trigger
BEFORE INSERT
ON employees
FOR EACH ROW
EXECUTE FUNCTION check_positive_salary();
Cet exemple crée un trigger qui vérifie si le `salary` est positif avant qu'une nouvelle ligne ne soit insérée dans le tableau `employees`.
2. Déclenchement de l'enregistrement des modifications avant la mise à jour
sql
CREATE OR REPLACE FUNCTION log_update()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO employees_audit(employee_id, old_salary, new_salary, changed_on)
VALUES(OLD.id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER log_update_trigger
BEFORE UPDATE
ON employees
FOR EACH ROW
EXECUTE FUNCTION log_update();
Ici, un déclencheur enregistre les modifications du champ `salary` dans un tableau `employees_audit` avant qu'une mise à jour ne se produise.
3. Déclencheur BEFORE DELETE pour les actions en cascade
sql
CREATE OR REPLACE FUNCTION prevent_deletion()
RETURNS TRIGGER AS $$
BEGIN
IF EXISTS (SELECT 1 FROM orders WHERE orders.employee_id = OLD.id) THEN
RAISE EXCEPTION 'Employee cannot be deleted, related orders exist';
END IF;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER prevent_deletion_trigger
BEFORE DELETE
ON employees
FOR EACH ROW
EXECUTE FUNCTION prevent_deletion();
Ce déclencheur empêche la suppression d'un employé s'il existe des commandes connexes dans le tableau `orders`.
Conseils et bonnes pratiques
- Utilisez des noms de déclencheurs descriptifs. Cela améliore la lisibilité et la maintenance, en indiquant clairement ce que chaque déclencheur est censé faire.
- Veillez à ce que les fonctions de déclenchement soient simples. Une logique complexe peut entraîner des problèmes de performance et est plus difficile à déboguer.
- Effectuez un test approfondi. Veillez à ce que les déclencheurs se comportent comme prévu dans tous les scénarios afin d'éviter les problèmes d'intégrité des données.
- Déclencheurs de documents. Documentez clairement l'objectif et la logique de chaque déclencheur afin de pouvoir vous y référer ultérieurement et de favoriser la collaboration au sein de l'équipe.
- Tenez compte de l'impact sur les performances. Les déclencheurs peuvent affecter les performances ; utilisez-les à bon escient, en particulier pour les tableaux de grande taille ou les opérations fréquentes.
- Comprendre le comportement des transactions. Les déclencheurs `BEFORE` s'exécutent dans la transaction qui les a lancés, et les changements peuvent être annulés si la transaction échoue.
- Renvoyez la ligne correcte. Renvoyez toujours `NEW` ou `OLD` de manière appropriée pour vous assurer que le déclencheur fonctionne correctement.
- Désactivation temporaire des déclencheurs. Vous pouvez désactiver les déclencheurs pendant les opérations de masse ou les tableaux de maintenance en utilisant `ALTER TABLE nom_table DISABLE TRIGGER nom_du_gâcheur;` et les réactiver avec `ALTER TABLE nom_table ENABLE TRIGGER nom_du_gâcheur;`.