0Pricing
SQL Academy · Lektion

Tabellen mit Triggern auditieren

Erstellen Sie mit AFTER-INSERT/UPDATE/DELETE-Triggern, die in eine audit_log-Tabelle schreiben, eine Audit-Spur.

Tabellen mit Triggern auditieren ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Auditierung?

Auditprotokolle beantworten die Frage: „Wer hat was wann geändert?“ Sie sind für Compliance-Anforderungen erforderlich (HIPAA, SOX, Untersuchungen zur Löschung nach DSGVO) und dienen der operativen Forensik.

Die Audittabelle

Eine zentrale Tabelle erfasst jede Änderung:

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
);

Die Audit-Triggerfunktion

Eine Funktion, die für viele Tabellen wiederverwendet werden kann:

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;

An Tabellen anhängen

Trigger für 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)

Der to_jsonb-Trick erfasst die gesamte Zeile generisch – ohne Code für einzelne Spalten. Er funktioniert für jede Tabelle mit einer id-Spalte.

Den Akteur erfassen

Wenn die Anwendung als einzelner Datenbankbenutzer ausgeführt wird, reicht CURRENT_USER nicht aus. Übergeben Sie den Anwendungsbenutzer über eine Sitzungs-GUC:

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

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

Bestimmte Spalten auditieren

Verwenden Sie die WHEN-Klausel des Triggers für eine selektive Auditierung:

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();

Audittabellen pro Tabelle

Alternative: eine Audittabelle pro tatsächlicher Tabelle (z. B. users_audit) mit demselben Schema und zusätzlichen Audit-Metadaten. Einfacher abzufragen, aber mehr DDL-Wartungsaufwand.

Nur Änderungen auditieren

Speichern Sie nur die geänderten Spalten:

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)
);

Performance der Audittabelle

Die Audittabelle wächst auf stark ausgelasteten Systemen schnell. Partitionieren Sie sie nach Zeit:

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');

Abwägung bei der Performance

Jedes Insert/Update/Delete schreibt nun eine zweite Zeile. Bei Tabellen mit sehr vielen Schreibvorgängen kann sich die E/A-Last dadurch verdoppeln. Testen und überwachen Sie dies und entscheiden Sie, ob sich dieser Kompromiss lohnt.

Wann Sie KEINE Datenbank-Trigger verwenden sollten

Wenn Sie eine Integration in einen Event-Bus benötigen, reihen Sie Ereignisse mit NOTIFY oder LISTEN ein oder verwenden Sie logische Replikation bzw. CDC-Tools (Debezium) statt Triggern.

Rückblick

Audit-Trigger sind die einfachste Möglichkeit, den Änderungsverlauf zu erfassen.

  • Eine generische Funktion mit to_jsonb(NEW/OLD)
  • An jede zu auditierende Tabelle anhängen
  • Audittabellen nach Zeit partitionieren
  • Den Anwendungsakteur explizit über GUCs erfassen

Kurzer Test

Wie erfassen Sie innerhalb einer Audit-Triggerfunktion die neue Zeile generisch als JSONB?

Häufig gestellte Fragen

Ist die Lektion „Tabellen mit Triggern auditieren“ kostenlos?

Ja — der vollständige Text von „Tabellen mit Triggern auditieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Tabellen mit Triggern auditieren“?

Erstellen Sie mit AFTER-INSERT/UPDATE/DELETE-Triggern, die in eine audit_log-Tabelle schreiben, eine Audit-Spur. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um SQL Academy zu starten?

Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Tabellen mit Triggern auditieren“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?

Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Aufbau von Triggern: BEFORE/AFTER, FOR EACH ROW
  2. Grundlagen von PL/pgSQL-Funktionen
  3. DO-Blöcke und anonymer Code
  4. Tabellen mit Triggern auditieren
← Zurück zu SQL Academy