Account-Löschung mit Einwandsfrist (Soft Delete + Anonymisierung)
Kurz: Statt einen Account sofort beim Löschantrag unwiderruflich zu entfernen, wird zunächst nur ein Zeitpunkt vorgemerkt (pending_deletion_at) — erst nach Ablauf einer Frist wird der Account tatsächlich anonymisiert.
Genauer: Eine sofortige, harte Löschung ist riskant: ein versehentlicher Klick, ein kompromittierter Account, oder ein Widerruf des Löschwunschs wären sonst nicht mehr rückgängig zu machen. Die Frist gibt Raum für ein “Rückgängig”, ohne dem Recht auf Löschung (Art. 17 DSGVO) zu widersprechen — nach Fristablauf werden personenbezogene Daten entfernt/anonymisiert (anonymizedAt markiert, WANN das geschehen ist).
Kontext bei uns: db/migrations/add_v27_session_version_deletion.sql bei Emzett fügt users.pending_deletion_at und users.anonymized_at hinzu — 7-Tage-Einwandsfrist vor der tatsächlichen Anonymisierung.
Im Detail
Kein Rechtsberatung, sondern eine technische Einordnung. Das Recht auf Löschung (Art. 17 DSGVO) verlangt nicht zwingend eine sofortige, harte Löschung — es verlangt, dass personenbezogene Daten ohne unangemessene Verzögerung gelöscht werden, sobald der Zweck der Speicherung entfällt. Eine kurze, klar kommunizierte Einwandsfrist mit einem eindeutigen Hinweis, wie man den Löschwunsch widerrufen kann, gilt allgemein als vertretbar, solange sie nicht dazu missbraucht wird, die Löschung faktisch zu verschleppen.
Technisch unterscheidet man zwei Stufen: Soft Delete (der Datensatz bleibt vollständig erhalten, nur ein Flag/Zeitstempel markiert ihn als „zur Löschung vorgemerkt“ — reversibel) und Anonymisierung (personenbezogene Felder werden durch nicht mehr zurückverfolgbare Platzhalter ersetzt — irreversibel). Wichtig für echte Anonymisierung: Es reicht nicht, nur offensichtliche Felder wie Name/E-Mail zu löschen — auch indirekte Identifikatoren (eine eindeutige Kombination aus Geburtsdatum + Postleitzahl, eine referenzierte, sonst leere Bestellhistorie) können eine Person re-identifizierbar machen, wenn sie stehen bleiben.
-- Vormerken (reversibel)
UPDATE users SET pending_deletion_at = now() + interval '7 days' WHERE id = $1;
-- Nach Fristablauf (irreversibel, per Cron-Job)
UPDATE users SET email = 'deleted-' || id || '@anon.local', name = 'Gelöschter Nutzer', anonymized_at = now()
WHERE pending_deletion_at < now() AND anonymized_at IS NULL;Siehe auch: DSGVO-Datenexport (Art. 15/20), DSGVO