Accéder au contenu principal

Déclencheurs AFTER de PostgreSQL

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 AFTER est exécuté après la fin de l'événement déclencheur, ce qui lui permet d'accéder à l'état final des données.

Utilisation

Les déclencheurs APRÈS sont utilisés lorsque vous devez effectuer des actions après un événement de modification des données, en veillant à ce que toute opération dépendante ne se produise qu'une fois l'événement initial terminé avec succès. Ils sont définis à l'aide de l'instruction CREATE TRIGGER.


CREATE TRIGGER trigger_name
AFTER event [OR event ...]
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();

Dans cette syntaxe, AFTER event spécifie l'événement (INSERT, UPDATE, DELETE) qui active le déclencheur, et function_name() est la fonction à exécuter après l'événement.

Exemples

1. Déclencheur de base AFTER INSERT


CREATE OR REPLACE FUNCTION log_new_user()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO user_logs(user_id, action, log_time)
  VALUES (NEW.id, 'User Created', NOW());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
EXECUTE FUNCTION log_new_user();

Cet exemple tableau l'entrée d'un nouvel utilisateur dans user_logs après une insertion dans le tableau users.

2. Déclencheur AFTER UPDATE


CREATE OR REPLACE FUNCTION update_inventory_log()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO inventory_logs(product_id, change, log_time)
  VALUES (NEW.product_id, NEW.quantity - OLD.quantity, NOW());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_inventory_update
AFTER UPDATE ON inventory
FOR EACH ROW
EXECUTE FUNCTION update_inventory_log();

Ce déclencheur tableau la modification de la quantité d'un produit à inventory_logs après la mise à jour du tableau inventory.

3. Déclencheur AFTER DELETE avec logique conditionnelle


CREATE OR REPLACE FUNCTION log_deleted_order()
RETURNS TRIGGER AS $$
BEGIN
  IF OLD.status = 'completed' THEN
    INSERT INTO order_logs(order_id, action, log_time)
    VALUES (OLD.id, 'Completed Order Deleted', NOW());
  END IF;
  RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_order_delete
AFTER DELETE ON orders
FOR EACH ROW
EXECUTE FUNCTION log_deleted_order();

Cet exemple tableau la suppression des commandes terminées du tableau orders, uniquement si l'état de la commande est "terminé".

Conseils et bonnes pratiques

  • Utilisez les déclencheurs AFTER pour les opérations dépendantes. Appliquez-les lorsque des actions ultérieures dépendent de l'achèvement de la transaction initiale.
  • Veillez à ce que les fonctions de déclenchement soient efficaces. Veillez à ce que la fonction exécutée par le déclencheur soit optimisée pour éviter de ralentir les transactions.
  • Évitez les logiques complexes. Simplifier la logique des déclencheurs afin de préserver la clarté et la facilité de maintenance.
  • Testez soigneusement les déclencheurs. Assurez-vous que les déclencheurs n'affectent pas involontairement la logique de l'application en les testant de manière exhaustive.
  • Documentez le comportement des déclencheurs. Conservez une documentation claire sur la fonction de chaque déclencheur, en particulier dans les applications de grande envergure.
  • Contrôler l'impact sur les performances. Utilisez des outils de journalisation ou de surveillance pour suivre l'impact des déclencheurs sur les performances des bases de données de production.
  • Comprendre les interactions entre les transactions. Les déclencheurs AFTER font partie de la transaction ; si une erreur survient dans la fonction de déclenchement, la transaction entière peut être annulée.
  • Tenez compte des limites. Soyez attentif aux conflits potentiels avec les contraintes de clés étrangères ou les actions en cascade lorsque vous utilisez des déclencheurs AFTER.
  • Gérer le cycle de vie des déclencheurs. Sachez comment désactiver ou supprimer un déclencheur lorsqu'il n'est plus nécessaire en utilisant ALTER TABLE ou DROP TRIGGER.