INVALID_CROSS_REFERENCE_KEY bei Salesforce-Deployments beheben

Eine deployte Komponente verweist über eine ID oder einen API-Namen auf einen anderen Datensatz oder ein Feld, der bzw. das in der Ziel-Org nicht existiert.

Tritt auf bei: sowohl der Metadaten-Deployment-Validierung als auch DML zur Laufzeit auf Datensatz-IDs

Was das bedeutet

INVALID_CROSS_REFERENCE_KEY bedeutet, dass Salesforce versucht hat, eine Referenz innerhalb Ihrer Metadaten aufzulösen, eine Datensatz-ID, einen Feld-API-Namen, ein Page Layout, eine Permission-Set-Zuweisung, und keine Übereinstimmung in der Ziel-Org gefunden hat. Die Referenz selbst kann in der Ursprungs-Org völlig gültig sein; das Problem ist, dass die Org, die das Deployment empfängt, noch keine passende Komponente hat oder nie haben wird.

Dies tritt in zwei unterschiedlichen Kontexten auf: zum Deployment-Zeitpunkt, wenn die Metadata API eine Komponentenreferenz auflöst, und zur Laufzeit, wenn Apex oder die API eine Datensatz-ID übergibt, die keinem für den ausführenden Benutzer sichtbaren Datensatz in dieser Org entspricht.

Diagnose

Häufige Ursachen

Hartcodierte Datensatz-ID aus einer anderen Org
Ein Flow, Approval Process oder eine Apex-Class speichert eine Datensatz-ID, die nur in der Quell-Sandbox existiert, sodass die Ziel-Org nichts hat, womit sie übereinstimmen könnte.
Abhängigkeit in falscher Reihenfolge deployt
Ein Feld, ein Record Type oder ein Layout, auf das die deployte Komponente verweist, war nicht im selben Paket enthalten oder ist noch nicht in der Ziel-Org angekommen.
Veralteter oder umbenannter API-Name
Die Komponente wurde umbenannt oder ihr API-Name in einer Org geändert, aber die darauf verweisende Referenz wurde nie aktualisiert.

Die Lösung

  1. Hartcodierte IDs durch Lookups ersetzen
    Ersetzen Sie jede hartcodierte 18-stellige Datensatz-ID durch eine SOQL-Query, einen Custom Metadata Type oder ein Custom Setting, damit sich die Referenz pro Org auflöst.
    Id defaultRecordTypeId = Schema.SObjectType.Case
        .getRecordTypeInfosByDeveloperName()
        .get('Support_Request')
        .getRecordTypeId();
  2. Die vollständige Abhängigkeitskette bündeln
    Fügen Sie jedes Feld, jeden Record Type und jedes Layout, von dem die Komponente abhängt, in dasselbe Deployment ein und deployen Sie in Abhängigkeitsreihenfolge.
  3. Prüfen, ob der API-Name exakt übereinstimmt
    Bestätigen Sie, dass der API-Name der referenzierten Komponente in der Ziel-Org identisch ist, einschließlich des __c-Suffixes und des Objektpräfixes.
In der Praxis

Wie Serpent das verhindert

Serpent AI kartiert den vollständigen Abhängigkeitsgraphen, bevor eine Aufgabe überhaupt das Deployment erreicht, sodass eine fehlende oder umbenannte Referenz als Scoping-Warnung erscheint statt als fehlgeschlagenes Deployment. Siehe die Bibliothek der Salesforce-Deploymentfehler für verwandte Fehler.

Metadaten und Daten in einem einzigen Deployment-Flow in Serpent

Prävention

Hartcodierte Datensatz-IDs im Code-Review verbieten
Behandeln Sie jede literale 15- oder 18-stellige ID in Apex, Flow oder einer Formel als Review-Blocker; lösen Sie Referenzen stattdessen über API-Namen, External ID oder Custom Metadata Type auf.
In expliziter Abhängigkeitsreihenfolge deployen, nicht alphabetisch oder in Standardreihenfolge
Definieren Sie eine explizite Deployment-Reihenfolge für voneinander abhängige Metadaten, statt sich auf die Standardreihenfolge zu verlassen, die Ihr Tooling zufällig erzeugt.
Vor dem Umbenennen eines API-Namens nach jeder Referenz suchen
Durchsuchen Sie Apex, Flow, Formeln und Layouts nach dem aktuellen API-Namen einer Komponente, bevor Sie sie umbenennen, damit keine veraltete Referenz zurückbleibt.
Häufige Fragen

INVALID_CROSS_REFERENCE_KEY, beantwortet

Bedeutet INVALID_CROSS_REFERENCE_KEY, dass ich Daten verloren habe?
Nein. Es bedeutet, dass das Deployment gestoppt wurde, bevor es die Ziel-Org berührt hat, weil eine Referenz innerhalb Ihrer Metadaten dort nicht aufgelöst werden konnte.
Können Freigabeeinstellungen diesen Fehler verursachen, auch wenn der Datensatz existiert?
Ja. Wenn der ausführende Benutzer aufgrund von Sharing Rules oder Org-Wide Defaults einen Datensatz nicht sehen kann, kann Salesforce ihn genauso behandeln wie einen tatsächlich fehlenden Datensatz.
Tritt das bei Standardfeldern auf, oder nur bei benutzerdefinierten?
Es kann bei beiden auftreten. Eine Referenz auf ein Standardfeld oder einen Datensatz, das bzw. den die Edition oder Konfiguration der Ziel-Org nicht unterstützt, wird genauso aufgelöst wie eine fehlende benutzerdefinierte Komponente.

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.