-- Audit-Log: wer hat was wann getan. Zweck ist die Nachvollziehbarkeit nach -- einem Vorfall – deshalb muss ein Eintrag auch dann noch lesbar sein, wenn der -- handelnde oder betroffene Account längst gelöscht ist. CREATE TABLE audit_log ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- ON DELETE SET NULL statt CASCADE: sonst räumte das Löschen eines Users -- genau die Spuren weg, die man danach untersuchen will. actor_id UUID REFERENCES users(id) ON DELETE SET NULL, -- Denormalisiert, damit der Name den gelöschten Account überlebt. actor_name TEXT NOT NULL, action TEXT NOT NULL, target_type TEXT, target_id TEXT, target_name TEXT, ip TEXT, detail TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- Die Admin-Ansicht liest immer neueste zuerst, oft gefiltert nach Aktion oder -- handelndem Konto. CREATE INDEX idx_audit_log_created ON audit_log (created_at DESC); CREATE INDEX idx_audit_log_actor ON audit_log (actor_id, created_at DESC); CREATE INDEX idx_audit_log_action ON audit_log (action, created_at DESC);