Les déclencheurs dans PostgreSQL sont des procédures spéciales qui sont automatiquement exécutées ou déclenchées lorsque certains événements se produisent dans un tableau de la base de données. Ils sont utilisés pour maintenir l'intégrité des données, appliquer des règles commerciales et automatiser des contrôles ou des transformations complexes.
Utilisation
Les déclencheurs sont utilisés pour répondre automatiquement à des événements tels que les opérations `INSERT`, `UPDATE`, ou `DELETE` sur un tableau. Elles peuvent être définies pour s'exécuter "AVANT", "APRES" ou "EN DEHORS" de l'événement et peuvent optionnellement être conditionnées à la réussite de l'événement. Les déclencheurs peuvent être définis au niveau de la ligne, s'exécutant pour chaque ligne affectée, ou au niveau de l'instruction, s'exécutant une fois par instruction SQL.
CREATETRIGGER trigger_name
{BEFORE|AFTER|INSTEADOF}{INSERT|UPDATE|DELETE}ON table_name
FOREACH{ROW|STATEMENT}EXECUTEFUNCTIONfunction_name();Propulsé par
Dans cette syntaxe, `CREATE TRIGGER` définit un nouveau trigger nommé `nom_trigger` qui appelle une fonction spécifiée `nom_fonction` avant, après ou à la place d'un événement modifiant les données sur `nom_table`.
Les déclencheurs interagissent avec les commandes de contrôle des transactions comme `COMMIT` et `ROLLBACK`. Si un déclencheur provoque une erreur, l'ensemble de la transaction est généralement annulée, sauf si elle est explicitement gérée.
Exemples
1. Déclencheur de base pour l'audit
CREATETABLEaudit_log(
id SERIALPRIMARYKEY,
operation VARCHAR(10),
operation_time TIMESTAMPDEFAULTCURRENT_TIMESTAMP);CREATEORREPLACEFUNCTIONlog_insert()RETURNSTRIGGERAS $$
BEGININSERTINTOaudit_log(operation)VALUES('INSERT');RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER insert_audit
AFTERINSERTON target_table
FOREACHROWEXECUTEFUNCTIONlog_insert();Propulsé par
Cet exemple basique enregistre chaque opération `INSERT` sur `target_table` dans le tableau `audit_log`.
2. Déclenchement avec logique conditionnelle
CREATEORREPLACEFUNCTIONcheck_salary()RETURNSTRIGGERAS $$
BEGINIFNEW.salary <OLD.salary THENRAISEEXCEPTION'Salary cannot be decreased!';ENDIF;RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER salary_check
BEFOREUPDATEON employees
FOREACHROWEXECUTEFUNCTIONcheck_salary();Propulsé par
Ce déclencheur garantit que le salaire d'un employé ne peut pas être diminué au cours d'une opération de mise à jour.
3. Déclencheur en cascade
CREATEORREPLACEFUNCTIONdelete_cascade()RETURNSTRIGGERAS $$
BEGINDELETEFROM orders WHERE customer_id =OLD.id;RETURNOLD;END;
$$ LANGUAGE plpgsql;CREATETRIGGER cascade_delete
AFTERDELETEON customers
FOREACHROWEXECUTEFUNCTIONdelete_cascade();Propulsé par
Cet exemple supprime automatiquement toutes les commandes associées à un client lorsque celui-ci est supprimé.
Gestion des déclencheurs
Pour désactiver ou supprimer un déclencheur lorsqu'il n'est plus nécessaire, vous pouvez utiliser les commandes suivantes :
ALTERTABLE table_name DISABLETRIGGER trigger_name;DROPTRIGGER trigger_name ON table_name;Propulsé par
Pour visualiser les déclencheurs existants dans une base de données, vous pouvez interroger le catalogue système `pg_trigger`.
Conseils et bonnes pratiques
Veillez à ce que les déclencheurs soient simples. Une logique complexe peut entraîner des goulets d'étranglement au niveau des performances et des problèmes de maintenance.
Effectuez un test approfondi. Assurez-vous que vos déclencheurs fonctionnent comme prévu en les testant dans différents scénarios.
Déclencheurs de documents. Documentez clairement l'objectif et le fonctionnement de chaque déclencheur afin d'aider les futurs développeurs.
Considérez les autorisations. Assurez-vous que les utilisateurs qui déclenchent les événements disposent des autorisations nécessaires pour exécuter les fonctions associées.
Contrôler l'impact sur les performances. Sachez que l'utilisation intensive de déclencheurs peut nuire aux performances, en particulier pour les tableaux à fort volume de transactions.
Évitez les déclencheurs récursifs. Les déclencheurs récursifs peuvent entraîner des boucles infinies et doivent être manipulés avec prudence.
Les déclencheurs dans PostgreSQL sont des procédures spéciales qui sont automatiquement exécutées ou déclenchées lorsque certains événements se produisent dans un tableau de la base de données. Ils sont utilisés pour maintenir l'intégrité des données, appliquer des règles commerciales et automatiser des contrôles ou des transformations complexes.
Utilisation
Les déclencheurs sont utilisés pour répondre automatiquement à des événements tels que les opérations `INSERT`, `UPDATE`, ou `DELETE` sur un tableau. Elles peuvent être définies pour s'exécuter "AVANT", "APRES" ou "EN DEHORS" de l'événement et peuvent optionnellement être conditionnées à la réussite de l'événement. Les déclencheurs peuvent être définis au niveau de la ligne, s'exécutant pour chaque ligne affectée, ou au niveau de l'instruction, s'exécutant une fois par instruction SQL.
Dans cette syntaxe, `CREATE TRIGGER` définit un nouveau trigger nommé `nom_trigger` qui appelle une fonction spécifiée `nom_fonction` avant, après ou à la place d'un événement modifiant les données sur `nom_table`.
Les déclencheurs interagissent avec les commandes de contrôle des transactions comme `COMMIT` et `ROLLBACK`. Si un déclencheur provoque une erreur, l'ensemble de la transaction est généralement annulée, sauf si elle est explicitement gérée.
Exemples
1. Déclencheur de base pour l'audit
Cet exemple basique enregistre chaque opération `INSERT` sur `target_table` dans le tableau `audit_log`.
2. Déclenchement avec logique conditionnelle
Ce déclencheur garantit que le salaire d'un employé ne peut pas être diminué au cours d'une opération de mise à jour.
3. Déclencheur en cascade
Cet exemple supprime automatiquement toutes les commandes associées à un client lorsque celui-ci est supprimé.
Gestion des déclencheurs
Pour désactiver ou supprimer un déclencheur lorsqu'il n'est plus nécessaire, vous pouvez utiliser les commandes suivantes :
Pour visualiser les déclencheurs existants dans une base de données, vous pouvez interroger le catalogue système `pg_trigger`.
Conseils et bonnes pratiques