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'plusarchived_at/archived_byfür fachliche Archivierungstatus='inactive'für temporäre Stilllegungdeleted_at/deleted_byfür Soft Delete (typischerweise nur durch Admin-Werkzeuge)- Hard Delete: physisches
DELETE, Pflicht zu zusätzlicher Audit-Aktionhard_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.
| Wert | Bedeutung |
|---|---|
restrict | Aktion nicht erlaubt, solange aktive Beziehung besteht (Default) |
detach | Beziehung wird getrennt (deleted_at = now()), Endpunkte bleiben unverändert |
cascade | Aktion auf Endpunkt wird auf alle aktiven Beziehungen propagiert |
archive_only | nur 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 Endpunkt | restrict | detach | cascade | archive_only |
|---|---|---|---|---|
archive (Status archived + archived_at) | erlaubt, Beziehung bleibt aktiv | erlaubt, Beziehung wird detached | erlaubt, Beziehung wird mit-archiviert | erlaubt, Beziehung wird mit-archiviert |
soft_delete (deleted_at) | blockiert (fachlicher Fehler) | erlaubt, Beziehung wird detached | erlaubt, Beziehung wird mit-soft-gelöscht (deleted_at parallel) | blockiert — nur Archivierung erlaubt |
hard_delete (admin) | blockiert | blockiert (Integrität, FK ist RESTRICT) | erlaubt nur durch Admin-Werkzeug, kaskadiert auf Beziehung | blockiert |
Hinweise:
cascadesetzt 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 proDDM_RELATION_TYPEzu konfigurieren (offen).archive_onlyist 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 incascade-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 RESTRICTdeklariert (Stammtabellen). - Partial Unique Indexes (
uq_entity_code_active) verhindern Wiederverwendung einescodedurch einen aktiven Datensatz, solange ein gleicher Soft-Delete-Eintrag besteht.
Reihenfolge bei Soft Delete einer Entität
- Service-Layer prüft alle aktiven
DDM_ENTITY_RELATIONs mit Bezug auf die Entität. - Je nach
delete_policy:restrict→ Abbruch mit fachlichem Fehler.detach→ markiere betroffeneDDM_ENTITY_RELATIONalsdeleted_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 stattdessenarchivebenutzen.
- Setze
deleted_at,deleted_byan der Entität. - Schreibe Audit-Eintrag
soft_delete(Korrelations-ID gemeinsam mitunrelate-Einträgen). - Optional:
DDM_ENTITY_VERSION-Snapshot.
Wiederherstellung
- Reaktivierung eines soft-gelöschten Datensatzes: setzen von
deleted_at = NULLplus Audit-Aktionrestore. Konkrete Workflow-/Berechtigungsregeln offen. archived→active-Übergang ist über Statuswechsel mit Audit-Aktionrestoreabzubilden.
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
cascadebraucht klare Beispiele und Genehmigungsregeln; optionale Konfiguration „cascade auf Gegenseiten-Entität” ist noch nicht spezifiziert.