Accéder au contenu principal
Documents
Gestion des tableaux et des schémasSyntaxe de baseDéclencheursBases de donnéesFonctions de la dateFonctions des chaînes de caractèresFonctions mathématiquesFonctions JSONIndexes

Cas d'utilisation de PostgreSQL

Les déclencheurs dans PostgreSQL sont des fonctions de rappel de base de données qui s'exécutent automatiquement lorsqu'un événement de base de données spécifique se produit, comme une opération `INSERT`, `UPDATE`, ou `DELETE`. Ils sont utilisés pour appliquer les règles de gestion, valider les données d'entrée et maintenir l'intégrité des données.

Utilisation

Les déclencheurs automatisent des tâches et appliquent des règles au niveau de la base de données, garantissant que des opérations spécifiques se produisent en réponse à des changements dans les données. Ils se composent d'un événement déclencheur, d'un timing et de la fonction associée à exécuter.


CREATE TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | UPDATE | DELETE }
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();

Dans cette syntaxe, `CREATE TRIGGER` définit un nouveau trigger, en spécifiant quand il doit se déclencher (`BEFORE`, `AFTER`, ou `INSTEAD OF` un événement) et la fonction qu'il doit exécuter. Les triggers `BEFORE` sont typiquement utilisés pour modifier les données avant qu'elles ne soient écrites dans la base de données, les triggers `AFTER` sont utilisés pour les actions qui doivent se produire une fois que les données sont validées, et les triggers `INSTEAD OF` sont souvent utilisés sur les vues pour effectuer les modifications nécessaires sur les tableaux sous-jacents.

  • FOR EACH ROW indique que la fonction de déclenchement sera exécutée une fois pour chaque ligne affectée par l'événement déclencheur. En revanche, FOR EACH STATEMENT peut être utilisé pour exécuter la fonction de déclenchement une fois par instruction SQL, quel que soit le nombre de lignes affectées.
  • NEW et OLD sont des variables d'enregistrement spéciales dans les déclencheurs : NEW contient les nouvelles données de ligne pour les opérations INSERT ou UPDATE, et OLD contient les données de ligne existantes pour les opérations UPDATE ou DELETE.

Exemples

1. Déclencheur d'insertion de base


CREATE FUNCTION log_insert() RETURNS TRIGGER AS $$
BEGIN
    -- Log every insert operation into log_table
    INSERT INTO log_table(action, timestamp) VALUES ('Insert', now());
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER before_insert
BEFORE INSERT ON main_table
FOR EACH ROW
EXECUTE FUNCTION log_insert();

Cet exemple crée un trigger qui enregistre chaque opération d'insertion sur la `table_principale` dans une `table_log`.

2. Mise à jour du déclencheur avec la condition


CREATE FUNCTION update_timestamp() RETURNS TRIGGER AS $$
BEGIN
    -- Update the updated_at timestamp field when a row is modified
    NEW.updated_at := now();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER update_time
BEFORE UPDATE ON main_table
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE FUNCTION update_timestamp();

Ce trigger met à jour le champ `updated_at` dans `main_table` à chaque fois qu'une ligne est modifiée.

3. Déclencheur complexe pour l'audit


CREATE FUNCTION audit_changes() RETURNS TRIGGER AS $$
BEGIN
    IF (TG_OP = 'DELETE') THEN
        -- Log DELETE operations into audit_log
        INSERT INTO audit_log(action, old_data, timestamp) VALUES ('DELETE', OLD, now());
    ELSIF (TG_OP = 'UPDATE') THEN
        -- Log UPDATE operations with both old and new data
        INSERT INTO audit_log(action, old_data, new_data, timestamp) VALUES ('UPDATE', OLD, NEW, now());
    END IF;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER audit_trigger
AFTER INSERT OR UPDATE OR DELETE ON main_table
FOR EACH ROW
EXECUTE FUNCTION audit_changes();

Ce trigger enregistre les modifications apportées à `main_table` dans un `audit_log`, capturant à la fois les anciennes et les nouvelles données pour les opérations `UPDATE`.

Conseils et bonnes pratiques

  • Optimisez les performances. Les déclencheurs peuvent alourdir les opérations de la base de données ; veillez donc à ce qu'ils soient efficaces.
  • Utilisez les déclencheurs avec parcimonie. Évitez de surutiliser les déclencheurs pour éviter la complexité et les problèmes de performance potentiels.
  • Assurer l'atomicité. Assurez-vous que les fonctions de déclenchement sont atomiques et qu'elles gèrent les exceptions afin de préserver l'intégrité des données.
  • Effectuez un test approfondi. Testez rigoureusement les déclencheurs dans un environnement de développement avant de les déployer en production afin d'éviter les effets secondaires imprévus.
  • Envisagez des alternatives. Évaluez si les procédures stockées ou la logique d'application sont mieux adaptées à certaines opérations afin de garantir la clarté et la facilité de maintenance.