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

Débogage de PostgreSQL

Les triggers PostgreSQL sont des fonctions de rappel de base de données qui s'exécutent automatiquement ou se "déclenchent" lorsqu'un événement de base de données spécifié se produit, comme un `INSERT`, `UPDATE`, `DELETE`, ou `TRUNCATE`. Ils sont utilisés pour maintenir l'intégrité des données, appliquer des règles commerciales ou effectuer des opérations de journalisation et d'audit.

Utilisation

Les déclencheurs sont utilisés lorsque vous devez automatiser des tâches en réponse à des modifications des données d'un tableau. Ils sont particulièrement utiles pour maintenir la cohérence et mettre en œuvre une logique commerciale complexe au niveau de la base de données.

sql
CREATE TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | UPDATE | DELETE | TRUNCATE }
ON table_name
[ FOR EACH ROW | FOR EACH STATEMENT ]
EXECUTE PROCEDURE function_name();

Dans cette syntaxe, `CREATE TRIGGER` définit un nouveau trigger nommé `trigger_name`, en spécifiant quand il doit se déclencher (`BEFORE`, `AFTER`, ou `INSTEAD OF`), quel événement doit le déclencher (`INSERT`, `UPDATE`, `DELETE`, ou `TRUNCATE`), et la table à laquelle il s'applique (`ON table_name`). `EXECUTE PROCEDURE` appelle la fonction qui contient la logique de déclenchement.

Exemples

1. Déclencheur de base sur l'insert

sql
CREATE OR REPLACE FUNCTION log_insert()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO log_table(action, timestamp) VALUES ('INSERT', NOW());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insert_trigger
AFTER INSERT ON main_table
FOR EACH ROW
EXECUTE PROCEDURE log_insert();

Cet exemple crée un trigger qui enregistre une entrée dans `log_table` à chaque fois qu'une nouvelle ligne est insérée dans `main_table`.

2. Déclenchement de l'application d'une règle de gestion

sql
CREATE OR REPLACE FUNCTION check_salary()
RETURNS TRIGGER AS $$
BEGIN
  IF NEW.salary < 1000 THEN
    RAISE EXCEPTION 'Salary cannot be less than 1000';
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER salary_check
BEFORE INSERT OR UPDATE ON employees
FOR EACH ROW
EXECUTE PROCEDURE check_salary();

Ici, un déclencheur permet de s'assurer que le salaire d'un employé n'est pas inférieur à 1000, que ce soit lors d'une insertion ou d'une mise à jour.

3. Déclenchement de l'enregistrement des audits

sql
CREATE OR REPLACE FUNCTION audit_changes()
RETURNS TRIGGER AS $$
BEGIN
  IF TG_OP = 'UPDATE' THEN
    INSERT INTO audit_log(table_name, operation, old_data, new_data, changed_at)
    VALUES (TG_TABLE_NAME, TG_OP, ROW(OLD.*), ROW(NEW.*), NOW());
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER audit_trigger
AFTER UPDATE ON any_table
FOR EACH ROW
EXECUTE PROCEDURE audit_changes();

Cet exemple capture les changements dans `any_table` en enregistrant l'ancienne et la nouvelle ligne dans un tableau `audit_log` après chaque mise à jour.

Gestion des déclencheurs

Pour désactiver un déclencheur :

sql
ALTER TABLE table_name DISABLE TRIGGER trigger_name;

Pour activer un déclencheur :

sql
ALTER TABLE table_name ENABLE TRIGGER trigger_name;

Pour supprimer un déclencheur :

sql
DROP TRIGGER trigger_name ON table_name;

Conseils et bonnes pratiques

  • Veillez à ce que les déclencheurs soient simples et efficaces. Une logique complexe peut ralentir les opérations de la base de données. Soyez prudent quant aux conséquences sur les performances, en particulier dans les environnements hautement transactionnels.
  • Utilisez des déclencheurs pour les contraintes critiques. Veillez à ce que les règles commerciales essentielles soient appliquées au niveau de la base de données.
  • Limitez les effets secondaires. Les déclencheurs doivent éviter de modifier l'état de la base de données de manière inattendue.
  • Déclencheurs de documents. Conservez une documentation claire pour chaque déclencheur afin d'aider les futurs développeurs à comprendre son objectif.
  • Effectuez un test approfondi. Assurez-vous que les déclencheurs fonctionnent comme prévu en testant divers scénarios et cas limites.
  • Soyez attentif à l'ordre d'exécution. Comprendre l'ordre d'exécution lorsque plusieurs déclencheurs sont définis pour le même événement sur un tableau.
  • Gérer les appels récursifs. Soyez conscient des appels déclencheurs récursifs potentiels et mettez en œuvre des mesures de protection si nécessaire.