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

PostgreSQL A LA PLACE des déclencheurs

Les déclencheurs dans PostgreSQL sont des procédures spéciales qui s'exécutent automatiquement en réponse à certains événements sur un tableau ou une vue. Le trigger `INSTEAD OF` vous permet spécifiquement de définir un comportement personnalisé pour des actions comme `INSERT`, `UPDATE`, ou `DELETE` sur les vues.

Utilisation

Les déclencheurs `INSTEAD OF` sont utilisés lorsque vous avez besoin de remplacer l'action par défaut d'une vue, permettant ainsi une logique complexe ou une manipulation de données qui n'est pas directement supportée par les opérations SQL standard. Ces déclencheurs sont définis pour se produire "en amont" de l'événement déclencheur. Notez que les déclencheurs `INSTEAD OF` ne s'appliquent qu'aux vues et non aux tableaux.


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

Dans cette syntaxe, `INSTEAD OF` spécifie que le trigger remplacera l'opération par défaut sur la vue spécifiée par la logique définie dans `function_name`. Les enregistrements `NEW` et `OLD` dans les fonctions de déclenchement représentent les nouvelles données pour un `INSERT` ou un `UPDATE`, et les données existantes pour un `UPDATE` ou un `DELETE`, respectivement.

Exemples

1. Basic INSTEAD OF INSERT Trigger (déclencheur de base à la place de l'insertion)


CREATE FUNCTION insert_employee()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO employees (id, name)
    VALUES (NEW.id, NEW.name);
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insert_employee_trigger
INSTEAD OF INSERT ON employees_view
FOR EACH ROW
EXECUTE FUNCTION insert_employee();

Cet exemple définit un trigger `INSTEAD OF INSERT` qui insère des données dans le tableau `employees` lorsqu'une insertion est tentée sur `employees_view`.

2. Déclencheur INSTEAD OF UPDATE


CREATE FUNCTION update_employee_name()
RETURNS TRIGGER AS $$
BEGIN
    UPDATE employees
    SET name = NEW.name
    WHERE id = OLD.id;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER update_employee_trigger
INSTEAD OF UPDATE ON employees_view
FOR EACH ROW
EXECUTE FUNCTION update_employee_name();

Ce trigger remplace une mise à jour de `employees_view` par une mise à jour de `employees`, en modifiant le champ `name` en fonction des changements de la vue.

3. AU LIEU D'UN DÉCLENCHEMENT DE SUPPRESSION


CREATE FUNCTION delete_employee()
RETURNS TRIGGER AS $$
BEGIN
    DELETE FROM employees
    WHERE id = OLD.id;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER delete_employee_trigger
INSTEAD OF DELETE ON employees_view
FOR EACH ROW
EXECUTE FUNCTION delete_employee();

Le trigger gère les suppressions sur `employees_view` en supprimant l'entrée correspondante dans le tableau `employees`.

Conseils et bonnes pratiques

  • Utilisation avec les vues. Les déclencheurs `INSTEAD OF` sont très utiles avec les vues, car ils vous permettent de définir comment les opérations sur une vue se traduisent dans les tableaux de base.
  • Assurer l'exactitude de la fonction. La fonction utilisée dans le déclencheur doit traiter tous les cas possibles pour l'opération afin d'éviter des comportements inattendus.
  • Testez soigneusement les déclencheurs. Les déclencheurs pouvant modifier le comportement par défaut, il est essentiel de procéder à des tests approfondis pour s'assurer qu'ils fonctionnent comme prévu.
  • Utilisez les transactions. Pensez à utiliser des transactions dans les fonctions de déclenchement pour maintenir l'intégrité des données, en particulier lorsque l'opération comporte plusieurs étapes.
  • Documentez vos déclencheurs. Une documentation claire permet de maintenir la lisibilité du code et aide les autres développeurs à comprendre la logique personnalisée.
  • Tenez compte des implications en termes de performances. Soyez conscient que la logique complexe dans les déclencheurs `INSTEAD OF` peut conduire à une surcharge de performance, optimisez donc les fonctions de déclenchement pour plus d'efficacité.

Autres considérations

  • Cas d'utilisation. Les triggers `INSTEAD OF` sont particulièrement utiles pour gérer la logique de vue complexe qui ne peut pas être directement exprimée en SQL.
  • Information sur la version. Les déclencheurs `INSTEAD OF` ont été introduits dans la version 9.1 de PostgreSQL, ce qui est important pour la compatibilité avec les anciens systèmes.