OpsWeave — Soft-Delete-Strategie
AUDIT-FIX: L-09 — Dokumentiert, welche Entitaeten Soft-Delete vs. Hard-Delete verwenden.
Prinzip
Entitaeten, die Audit Trails erfordern oder von historischen Datensaetzen referenziert werden koennten, sollten Soft-Delete nutzen (is_active = 0). Junction-Tabellen, Konfigurationsdaten und kurzlebige Datensaetze duerfen Hard-Delete mit referentiellen Integritaetspruefungen verwenden.
Aktueller Stand
Soft-Delete (is_active = 0)
| Entitaet | Tabelle | Loeschansatz | Hinweise |
|---|---|---|---|
| Kunden | customers | is_active = 0 | Prueft auf offene Tickets vor Deaktivierung. Bestehende Tickets behalten die Kundenreferenz. |
Hard-Delete (Zeile entfernen)
| Entitaet | Tabelle | Referenzpruefung | Hinweise |
|---|---|---|---|
| Benutzer-Mitgliedschaft | tenant_user_memberships | Selbstloeschung verhindert | Entfernt Benutzer aus Mandant |
| Gruppen-Mitgliedschaft | user_group_memberships | Keine | Junction-Tabelle |
| Zuweisungsgruppen | assignee_groups | Kaskadierend (Mitglieder zuerst) | Entfernt Gruppe + Mitgliedschaften |
| Assets | assets | Prueft verknuepfte Tickets | CMDB-Elemente — Soft-Delete empfohlen |
| Asset-Beziehungen | asset_relations | Keine | DAG-Kanten |
| Ticket-Kategorien | ticket_categories | 409 falls Tickets zugewiesen | Hard-Delete nur wenn unbenutzt |
| Workflow-Vorlagen | workflow_templates | Prueft aktive Instanzen | Hat is_active-Spalte, loescht aber hart |
| KB-Artikel | kb_articles | Entfernt Verknuepfungen zuerst | Nutzt status-Feld, nicht is_active |
Empfehlung
Entitaeten, die in einem kuenftigen Release auf Soft-Delete migriert werden sollten:
| Entitaet | Grund |
|---|---|
| Assets | CMDB-Elemente werden von Tickets, SLA-Ketten, Compliance-Flags referenziert. Hard-Delete zerstoert historischen Kontext. |
| Workflow-Vorlagen | Abgeschlossene Workflow-Instanzen referenzieren die Vorlage. Soft-Delete bewahrt Audit Trail. |
| KB-Artikel | Hat bereits status: 'archived' — das statt Hard-Delete nutzen. |
| SLA-Definitionen | Historische Tickets referenzieren SLA-Stufen. Deaktivierung ist sicherer als Loeschung. |
| E-Mail-Konfigurationen | Empfangene Nachrichten referenzieren die Konfiguration. Deaktivierung bewahrt Nachrichtenverlauf. |
Migrationsmuster
typescript
// Statt:
await db.delete(entity).where(eq(entity.id, id));
// Verwende:
await db.update(entity).set({ is_active: 0, updated_at: now }).where(eq(entity.id, id));Stelle sicher, dass alle Listen-Queries standardmaessig WHERE is_active = 1 filtern, mit einem optionalen include_inactive-Parameter fuer Admin-Ansichten.