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.
CREATETRIGGER trigger_name
{BEFORE|AFTER|INSTEADOF}{INSERT|UPDATE|DELETE}ON table_name
FOREACHROWEXECUTEFUNCTIONfunction_name();Propulsé par
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
CREATEFUNCTIONlog_insert()RETURNSTRIGGERAS $$
BEGIN-- Log every insert operation into log_table
INSERTINTOlog_table(action, timestamp)VALUES('Insert',now());RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER before_insert
BEFOREINSERTON main_table
FOREACHROWEXECUTEFUNCTIONlog_insert();Propulsé par
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
CREATEFUNCTIONupdate_timestamp()RETURNSTRIGGERAS $$
BEGIN-- Update the updated_at timestamp field when a row is modified
NEW.updated_at :=now();RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER update_time
BEFOREUPDATEON main_table
FOREACHROWWHEN(OLD.*ISDISTINCTFROMNEW.*)EXECUTEFUNCTIONupdate_timestamp();Propulsé par
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
CREATEFUNCTIONaudit_changes()RETURNSTRIGGERAS $$
BEGINIF(TG_OP='DELETE')THEN-- Log DELETE operations into audit_log
INSERTINTOaudit_log(action, old_data, timestamp)VALUES('DELETE',OLD,now());ELSIF(TG_OP='UPDATE')THEN-- Log UPDATE operations with both old and newdataINSERTINTOaudit_log(action, old_data, new_data, timestamp)VALUES('UPDATE',OLD,NEW,now());ENDIF;RETURNNULL;END;
$$ LANGUAGE plpgsql;CREATETRIGGER audit_trigger
AFTERINSERTORUPDATEORDELETEON main_table
FOREACHROWEXECUTEFUNCTIONaudit_changes();Propulsé par
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.
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.
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 ROWindique 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 STATEMENTpeut être utilisé pour exécuter la fonction de déclenchement une fois par instruction SQL, quel que soit le nombre de lignes affectées.NEWetOLDsont des variables d'enregistrement spéciales dans les déclencheurs :NEWcontient les nouvelles données de ligne pour les opérationsINSERTouUPDATE, etOLDcontient les données de ligne existantes pour les opérationsUPDATEouDELETE.Exemples
1. Déclencheur d'insertion de base
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
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
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