So beheben Sie DELETE_FAILED bei Salesforce-Deployments

Das Löschen eines Datensatzes wird durch eine Lookup-Beziehung, einen Trigger oder einen laufenden Genehmigungsprozess blockiert, getrennt vom Metadaten-Fehler DEPENDENCY_EXISTS.

Tritt auf bei: Laufzeit-DML-Löschungen, bei Datenimporten, Batch-Jobs und Apex-Tests

Was das bedeutet

DELETE_FAILED ist ein Fehler auf Datenebene, der auftritt, wenn eine DML-Löschung nicht abgeschlossen werden kann, meist weil ein anderer Datensatz noch einen Lookup- oder Master-Detail-Verweis darauf hält, ein Trigger die Löschung verhindert hat oder der Datensatz durch einen laufenden Genehmigungsprozess gesperrt ist. Er betrifft das Löschen von Datensätzen bei Datenimporten und Apex-Tests, nicht das Löschen von Metadatenkomponenten.

Master-Detail-Kinder werden automatisch gelöscht, wenn der übergeordnete Datensatz gelöscht wird, daher betrifft dieser Fehler fast immer eine Lookup-Beziehung, bei der Salesforce die Wahl zwischen Kaskadieren oder Blockieren der Feldkonfiguration überlässt, oder eine Custom-Logik, die die Löschung ausdrücklich verhindert.

Diagnose

Häufige Ursachen

Kind-Datensätze verweisen noch per Lookup auf den Datensatz
Ein Lookup-Feld auf einem anderen Objekt verweist auf den zu löschenden Datensatz, und die Beziehung ist nicht auf automatisches Kaskadieren oder Leeren eingestellt.
Ein Trigger oder eine Validierungsregel blockiert die Löschung
Custom Apex oder eine Validierungsregel auf dem Objekt verhindert die Löschung unter bestimmten Bedingungen explizit, etwa bei einer Statusprüfung.
Datensatz ist durch einen Genehmigungsprozess gesperrt
Der Datensatz befindet sich mitten in einer Genehmigung, und Salesforce lässt Sie ihn währenddessen nicht löschen.

Die Lösung

  1. Zuerst Kind-Datensätze löschen oder neu zuordnen
    Entfernen oder aktualisieren Sie den Lookup auf abhängigen Datensätzen, bevor Sie den übergeordneten Datensatz löschen, oder stellen Sie das Feld auf Leeren beim Löschen um, falls das das richtige Verhalten ist.
  2. Trigger- und Validierungsregel-Logik prüfen
    Prüfen Sie Apex-Trigger (trigger.isDelete) und Validierungsregeln, die beim Löschen ausgelöst werden, auf löschblockierende Logik.
  3. Ausstehende Genehmigungen abbrechen oder abschließen
    Klären Sie jeden laufenden Genehmigungsprozess für den Datensatz, bevor Sie die Löschung versuchen.
In der Praxis

Wie Serpent das verhindert

Die Preflight-Prüfungen von Serpent markieren Datensätze und abhängige Metadaten, die die Datenänderungen einer Task betreffen würden, sodass eine blockierte Löschung schon vor einem Release sichtbar wird, statt mitten im Deployment zu scheitern. Siehe die Bibliothek der Salesforce-Deployment-Fehler.

No-Code-CI/CD-Pipeline-Builder in Serpent

Prävention

Kaskadenverhalten bereits beim Felddesign festlegen
Entscheiden Sie sich beim Anlegen eines Lookups bewusst zwischen „Wert dieses Felds leeren“ und „Löschen nicht zulassen“, statt das Standardverhalten erst bei einer Massenlöschung schmerzhaft zu entdecken.
Batch-Löschungen mit einer vorgelagerten Abhängigkeitsprüfung absichern
Fragen Sie Kind-Datensätze und ausstehende Genehmigungen ab, bevor ein Massenlöschjob läuft, und überspringen oder melden Sie blockierte übergeordnete Datensätze, statt den gesamten Batch scheitern zu lassen.
Löschblockierende Trigger dokumentieren, wo es nicht offensichtlich ist
Kommentieren Sie jeden Trigger, der Löschungen anhand von Status oder Geschäftsregel verhindert, damit künftige Datenbereinigungen den Fehler nicht blind treffen.
Häufige Fragen

DELETE_FAILED, erklärt

Ist DELETE_FAILED derselbe Fehler wie DEPENDENCY_EXISTS?
Nein. DEPENDENCY_EXISTS blockiert das Löschen von Metadaten, etwa eines Felds oder Objekts, weil andere Metadaten darauf verweisen. DELETE_FAILED blockiert das Löschen eines Datensatzes, weil andere Datensätze oder Automatisierung darauf verweisen.
Warum funktioniert das Löschen des übergeordneten Datensatzes manchmal, manchmal nicht, beim selben Lookup?
Das Löschverhalten des Lookup-Felds wird pro Feld festgelegt, nicht automatisch. Ist es auf Wert beim Löschen leeren eingestellt, wird der übergeordnete Datensatz problemlos gelöscht; ist es auf Löschung einschränken eingestellt, blockiert jede Kindreferenz das.
Zählt das Verschieben des Datensatzes in den Papierkorb für diese Prüfung als gelöscht?
Ja, ein Soft Delete in den Papierkorb löst weiterhin dieselben Abhängigkeits- und Trigger-Prüfungen aus wie eine endgültige Löschung; der Datensatz ist erst wirklich weg, wenn der Papierkorb geleert wird, aber die DELETE_FAILED-Prüfung läuft bereits beim Soft-Delete-Schritt.

Kostenlos starten. Keine Kreditkarte, keine Installation, keine Verpflichtung.

Einrichtung in unter 15 Minuten. Keine DevOps-Fachkraft nötig.

Neugierig auf schnelleres Shipping, bevor Sie einsteigen? Sprechen wir

Unverbindlich.