DEPENDENCY_EXISTS bei Salesforce-Deployments beheben

Salesforce löscht ein Feld, Objekt oder einen Picklist-Wert nicht, weil eine andere Komponente noch darauf verweist.

Tritt auf bei: Löschen von Metadaten, über destructiveChanges.xml oder Setup

Was das bedeutet

DEPENDENCY_EXISTS blockiert das Löschen von Metadaten, einem Custom Field, Objekt, Record Type oder Picklist-Wert, weil etwas anderes in der Org noch darauf verweist: eine Formel, eine Validation Rule, ein Flow, ein Report oder ein Page Layout. Salesforce schützt die Datenintegrität, indem es das Entfernen einer Komponente verweigert, solange noch Abhängigkeiten von ihr bestehen.

Dies tritt nur auf, wenn die Metadaten bereits in der Ziel-Org vorhanden sind und etwas sie löscht, sei es über Setup, ein destructiveChanges.xml-Deployment oder die Tooling API; es erscheint nie bei einem einfachen additiven Deployment neuer Metadaten.

Diagnose

Häufige Ursachen

Formelfeld oder Validation Rule verweist darauf
Ein Formelfeld, eine Validation Rule oder eine Workflow Rule liest das zu löschende Feld oder Objekt, und Salesforce verweigert es, diese Referenz zu brechen.
Reports oder List Views verwenden es noch
Ein gespeicherter Report, Report Type oder eine List View filtert oder zeigt das Feld an, wodurch es als "in Verwendung" gilt, selbst wenn es niemand mehr ausführt.
Flow oder Apex verweist noch auf das Feld
Ein Flow, ein Process-Builder-Prozess oder eine Apex-Class fragt das Feld ab oder weist es zu, sodass die Plattform es als aktive Abhängigkeit behandelt.

Die Lösung

  1. Jede Abhängigkeit mit Salesforces Dependency Check finden
    Verwenden Sie das Tool "Where is this used?" in Setup für das Feld oder Objekt, um jede Formel, jeden Flow, Report und jedes Layout aufzulisten, das darauf verweist.
  2. Jede Abhängigkeit zuerst entfernen oder aktualisieren
    Bearbeiten oder löschen Sie die referenzierende Formel, den Flow, die Validation Rule oder den Report, sodass sie nicht mehr auf die Komponente verweisen.
  3. Komponente in einem separaten Schritt löschen
    Sobald keine Abhängigkeiten mehr bestehen, löschen Sie das Feld oder Objekt für sich, nachdem die Abhängigkeitsbereinigung in der Ziel-Org angekommen ist.
    <!-- destructiveChangesPost.xml, deployed after the dependency cleanup lands -->
    <Package xmlns="http://soap.sforce.com/2006/04/metadata">
      <types>
        <members>Account.Legacy_Score__c</members>
        <name>CustomField</name>
      </types>
      <version>62.0</version>
    </Package>
In der Praxis

Wie Serpent das verhindert

Serpent führt eine Preflight-Abhängigkeitsprüfung durch, bevor eine Löschung eine gemeinsam genutzte Org erreicht, sodass ein noch referenziertes Feld als blockierte Aufgabe erscheint statt als fehlgeschlagenes Produktions-Deployment. Siehe die Bibliothek der Salesforce-Deploymentfehler.

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

Prävention

Abhängigkeitsprüfung vor der Planung jeder Feld- oder Objektabschaffung durchführen
Machen Sie "Where is this used?" zu einem Pflichtschritt in der Deprecation-Checkliste, nicht zu einem Debugging-Schritt, zu dem Sie erst nach dem ersten Fehlschlag greifen.
Referenzen abbauen, bevor die Löschung geplant wird
Bringen Sie die Bereinigung von Formeln, Flows und Reports als eigenständiges Deployment ein, und planen Sie die destruktive Löschung dann als separate, spätere Freigabe.
Das zweiphasige destruktive Deployment-Muster der Metadata API verwenden
Deployen Sie destructiveChangesPre.xml für die Vorab-Bereinigung und destructiveChangesPost.xml für die endgültige Entfernung, entsprechend der von Salesforce selbst empfohlenen Löschreihenfolge.
Häufige Fragen

DEPENDENCY_EXISTS, beantwortet

Warum erscheint DEPENDENCY_EXISTS erst beim Deployment in eine Sandbox oder Produktion?
Weil Sandboxes und Produktion oft Reports, Flows oder Layouts enthalten, die in einer Scratch Org oder Dev-Sandbox nicht existieren, bleibt die Abhängigkeit unsichtbar, bis Sie dorthin deployen, wo diese Abhängigkeiten tatsächlich existieren.
Erfasst das Tool "Where is this used?" jede Art von Abhängigkeit?
Es erfasst die meisten deklarativen Abhängigkeiten, Formeln, Flows, Layouts, Reports, kann aber dynamische Referenzen innerhalb von Apex übersehen, etwa einen aus einem String in SOQL zusammengesetzten Feldnamen, durchsuchen Sie also vor dem Löschen auch Ihre Codebasis.
Kann ich ein Feld löschen, das nur in einer inaktiven Flow-Version referenziert wird?
Nein. Salesforce prüft alle Versionen eines Flows, nicht nur die aktive, sodass eine inaktive Version, die das Feld referenziert, die Löschung weiterhin blockiert.

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

In unter 15 Minuten eingerichtet. Keine DevOps-Einstellung nötig.

Neugierig auf schnelleres Shipping, bevor Sie einsteigen? Sprechen wir

Unverbindlich.