Zum Inhalt springen

Löschen und Archivierung

Status: Entwurf · Spec-Kandidat: ja

Standard

Entitäten werden nicht physisch gelöscht, sondern archiviert oder fachlich deaktiviert. Hard Delete ist Ausnahmefall (administrativ).

Mechanismen am Datensatz:

  • status='archived' plus archived_at / archived_by für fachliche Archivierung
  • status='inactive' für temporäre Stilllegung
  • deleted_at / deleted_by für Soft Delete (typischerweise nur durch Admin-Werkzeuge)
  • Hard Delete: physisches DELETE, Pflicht zu zusätzlicher Audit-Aktion hard_delete

Löschregeln pro Beziehungstyp

DDM_RELATION_TYPE.delete_policy legt fest, was beim Versuch passiert, eine Quell- oder Zielentität zu löschen oder zu archivieren, solange aktive Beziehungen existieren.

WertBedeutung
restrictAktion nicht erlaubt, solange aktive Beziehung besteht (Default)
detachBeziehung wird getrennt (deleted_at = now()), Endpunkte bleiben unverändert
cascadeAktion auf Endpunkt wird auf alle aktiven Beziehungen propagiert
archive_onlynur Archivierung zulässig — Soft Delete und Hard Delete sind blockiert; Beziehung wird mit-archiviert

Die Standardregel ist restrict.

Interaktionsmatrix

Aktion auf eine Entität, die als Endpunkt einer aktiven DDM_ENTITY_RELATION eingebunden ist:

Aktion auf Endpunktrestrictdetachcascadearchive_only
archive (Status archived + archived_at)erlaubt, Beziehung bleibt aktiverlaubt, Beziehung wird detachederlaubt, Beziehung wird mit-archivierterlaubt, Beziehung wird mit-archiviert
soft_delete (deleted_at)blockiert (fachlicher Fehler)erlaubt, Beziehung wird detachederlaubt, Beziehung wird mit-soft-gelöscht (deleted_at parallel)blockiert — nur Archivierung erlaubt
hard_delete (admin)blockiertblockiert (Integrität, FK ist RESTRICT)erlaubt nur durch Admin-Werkzeug, kaskadiert auf Beziehungblockiert

Hinweise:

  • cascade setzt keine rekursive Mit-Löschung der Gegenseite voraus. Es kaskadiert nur auf die Beziehungs-Zeile (DDM_ENTITY_RELATION), nicht auf die andere Endpunkt-Entität. Eine zusätzliche Cascade auf die Gegenseite ist optional pro DDM_RELATION_TYPE zu konfigurieren (offen).
  • archive_only ist die Wahl für audit-/regulatorisch relevante Beziehungen (z. B. Vertragsbeziehungen): Daten und Beziehung bleiben dauerhaft erhalten, sind aber durch Status klar inaktiv markiert.
  • DB-Sicherheitsnetz: FKs sind ON DELETE RESTRICT. Die Matrix wird vom Service-Layer durchgesetzt; Hard Delete in cascade-Konfiguration ist explizite Admin-Operation (separater Pfad).

Verantwortung

Die Auswertung von delete_policy ist Aufgabe des Service-Layers (FR-007). Die Datenbank schützt zusätzlich:

  • FKs sind als ON DELETE RESTRICT deklariert (Stammtabellen).
  • Partial Unique Indexes (uq_entity_code_active) verhindern Wiederverwendung eines code durch einen aktiven Datensatz, solange ein gleicher Soft-Delete-Eintrag besteht.

Reihenfolge bei Soft Delete einer Entität

  1. Service-Layer prüft alle aktiven DDM_ENTITY_RELATIONs mit Bezug auf die Entität.
  2. Je nach delete_policy:
    • restrict → Abbruch mit fachlichem Fehler.
    • detach → markiere betroffene DDM_ENTITY_RELATION als deleted_at = now().
    • cascade → erweiterte Soft-Delete-Operation auf Beziehungs-Zeilen (Gegenseite bleibt unverändert, sofern nicht eigens konfiguriert).
    • archive_only → Soft-Delete-Aufruf wird abgewiesen; Aufrufer muss stattdessen archive benutzen.
  3. Setze deleted_at, deleted_by an der Entität.
  4. Schreibe Audit-Eintrag soft_delete (Korrelations-ID gemeinsam mit unrelate-Einträgen).
  5. Optional: DDM_ENTITY_VERSION-Snapshot.

Wiederherstellung

  • Reaktivierung eines soft-gelöschten Datensatzes: setzen von deleted_at = NULL plus Audit-Aktion restore. Konkrete Workflow-/Berechtigungsregeln offen.
  • archivedactive-Übergang ist über Statuswechsel mit Audit-Aktion restore abzubilden.

Offen

  • Hard-Delete-Regeln und Bestätigungs-Workflow (z. B. „mehraugen”, regulatorisch begründet) sind nicht spezifiziert.
  • Behandlung soft-gelöschter Datensätze in Reporting-Abfragen: Query-Layer filtert deleted_at IS NULL (OP-16); History-Abfragen über dedizierte API-Endpoints (offen).
  • Policy cascade braucht klare Beispiele und Genehmigungsregeln; optionale Konfiguration „cascade auf Gegenseiten-Entität” ist noch nicht spezifiziert.

Verwandte Dokumente