0Pricing
SQL Academy · Leçon

Auditer des tables avec des déclencheurs

Créez une piste d’audit avec des déclencheurs AFTER INSERT/UPDATE/DELETE qui écrivent dans une table audit_log.

Auditer des tables avec des déclencheurs est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.

Pourquoi auditer ?

Les journaux d’audit répondent à la question « qui a modifié quoi, et quand ? ». Ils sont nécessaires pour la conformité (HIPAA, SOX, GDPR et les investigations liées au droit à l’effacement) ainsi que pour les investigations opérationnelles.

La table d’audit

Une table centrale enregistre chaque modification :

CREATE TABLE audit_log (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  user_name TEXT NOT NULL DEFAULT CURRENT_USER,
  table_name TEXT NOT NULL,
  action TEXT NOT NULL,             -- INSERT, UPDATE, DELETE
  row_id TEXT,
  old_data JSONB,
  new_data JSONB
);

La fonction de déclencheur d’audit

Une seule fonction, réutilisable dans de nombreuses tables :

CREATE OR REPLACE FUNCTION audit_row()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO audit_log (table_name, action, row_id, old_data, new_data)
  VALUES (
    TG_TABLE_NAME,
    TG_OP,
    COALESCE(NEW.id::TEXT, OLD.id::TEXT),
    CASE WHEN TG_OP IN ('UPDATE','DELETE') THEN to_jsonb(OLD) END,
    CASE WHEN TG_OP IN ('INSERT','UPDATE') THEN to_jsonb(NEW) END
  );
  RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql;

Attacher aux tables

Déclenchez l’audit sur AFTER INSERT/UPDATE/DELETE :

CREATE TRIGGER trg_audit_users
AFTER INSERT OR UPDATE OR DELETE ON users
FOR EACH ROW EXECUTE FUNCTION audit_row();

to_jsonb(NEW)

L’astuce to_jsonb capture toute la ligne de manière générique — aucun code par colonne n’est nécessaire. Elle fonctionne pour toute table possédant une colonne id.

Identifier l’auteur de la modification

Si l’application s’exécute avec un seul utilisateur de base de données, CURRENT_USER ne suffit pas. Transmettez l’utilisateur de l’application via un GUC de session :

-- App sets:
SET LOCAL app.user_id = '42';

-- Trigger reads:
INSERT INTO audit_log (... actor_id ...) VALUES (..., current_setting('app.user_id', true)::BIGINT);

Auditer des colonnes spécifiques

Utilisez la clause WHEN du déclencheur pour un audit sélectif :

CREATE TRIGGER trg_audit_role_change
AFTER UPDATE OF role ON users
FOR EACH ROW WHEN (OLD.role IS DISTINCT FROM NEW.role)
EXECUTE FUNCTION audit_role_change();

Tables d’audit par table

Autre possibilité : une table d’audit par table réelle (par exemple users_audit), avec le même schéma et les métadonnées d’audit. Les requêtes sont plus simples, mais il y a davantage de DDL à maintenir.

Audit des seules différences

Stockez uniquement les colonnes modifiées :

INSERT INTO audit_log (table_name, action, changes)
VALUES (
  TG_TABLE_NAME, TG_OP,
  (SELECT jsonb_object_agg(key, value)
   FROM jsonb_each(to_jsonb(NEW))
   WHERE NEW.* IS DISTINCT FROM OLD.* AND to_jsonb(NEW)->key IS DISTINCT FROM to_jsonb(OLD)->key)
);

Performances de la table d’audit

La table d’audit grossit rapidement sur les systèmes très actifs. Partitionnez-la par date :

CREATE TABLE audit_log (...) PARTITION BY RANGE (ts);
CREATE TABLE audit_log_2024_q1 PARTITION OF audit_log
  FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

Compromis de performances

Chaque INSERT/UPDATE/DELETE écrit désormais une seconde ligne. Pour les tables qui subissent énormément d’écritures, cela peut doubler les E/S. Testez, surveillez et déterminez si ce compromis en vaut la peine.

Quand ne pas utiliser les déclencheurs de base de données

Si vous avez besoin d’une intégration à un bus d’événements, mettez les événements en file avec NOTIFY ou LISTEN, ou utilisez des outils de réplication logique / CDC (Debezium) plutôt que des déclencheurs.

Récapitulatif

Les déclencheurs d’audit sont le moyen le plus simple de capturer l’historique.

  • Une fonction générique avec to_jsonb(NEW/OLD)
  • À attacher à chaque table auditée
  • Partitionner les tables d’audit par date
  • Identifier explicitement l’auteur côté application via des GUC

Vérification rapide

Dans une fonction de déclencheur d’audit, comment capturer génériquement la nouvelle ligne au format JSONB ?

Questions Fréquemment Posées

La leçon « Auditer des tables avec des déclencheurs » est-elle gratuite ?

Oui — le texte complet de « Auditer des tables avec des déclencheurs » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Auditer des tables avec des déclencheurs » ?

Créez une piste d’audit avec des déclencheurs AFTER INSERT/UPDATE/DELETE qui écrivent dans une table audit_log. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Academy ?

Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Auditer des tables avec des déclencheurs » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?

Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Anatomie des déclencheurs : BEFORE/AFTER, FOR EACH ROW
  2. Bases des fonctions PL/pgSQL
  3. Blocs DO et code anonyme
  4. Auditer des tables avec des déclencheurs
← Retour à SQL Academy