INVALID_CROSS_REFERENCE_KEY in Salesforce-deployments oplossen

Een gedeployd component verwijst naar een ander record of veld via een ID of API-naam die niet bestaat in de doel-org.

Komt voor bij: zowel metadata-deployvalidatie als runtime-DML op record-ID's

Wat het betekent

INVALID_CROSS_REFERENCE_KEY betekent dat Salesforce probeerde een referentie binnen je metadata op te lossen, een record-ID, een API-naam van een veld, een page layout, een permission set-toewijzing, en geen overeenkomst kon vinden in de doel-org. De referentie zelf kan volkomen geldig zijn in de org waar hij vandaan komt; het probleem is dat de org die de deployment ontvangt nog geen bijpassend component heeft, of dat nooit zal krijgen.

Dit verschijnt in twee verschillende contexten: tijdens deployment, wanneer de Metadata API een componentreferentie oplost, en tijdens runtime, wanneer Apex of de API een record-ID doorgeeft dat niet overeenkomt met een record dat de uitvoerende gebruiker in die org kan zien.

Diagnose

Veelvoorkomende oorzaken

Hardgecodeerde record-ID uit een andere org
Een flow, approval process of Apex class slaat een record-ID op die alleen bestaat in de bron-sandbox, waardoor de doel-org niets heeft om hiermee te matchen.
Afhankelijkheid buiten volgorde gedeployed
Een veld, record type of layout waarnaar het gedeployde component verwijst, was niet opgenomen in hetzelfde package of is nog niet in de doel-org terechtgekomen.
Verouderde of hernoemde API-naam
Het component is hernoemd of de API-naam is gewijzigd in de ene org, maar de referentie die ernaar wijst is nooit bijgewerkt.

De oplossing

  1. Vervang hardgecodeerde ID's door lookups
    Vervang elke hardgecodeerde record-ID van 18 tekens door een SOQL-query, een Custom Metadata Type of een Custom Setting, zodat de referentie per org wordt opgelost.
    Id defaultRecordTypeId = Schema.SObjectType.Case
        .getRecordTypeInfosByDeveloperName()
        .get('Support_Request')
        .getRecordTypeId();
  2. Bundel de volledige dependency chain
    Neem elk veld, record type en layout waarvan het component afhankelijk is op in dezelfde deployment, en deploy in de juiste dependency-volgorde.
  3. Controleer of de API-naam exact overeenkomt
    Bevestig dat de API-naam van het gerefereerde component in de doel-org identiek is, inclusief het __c-achtervoegsel en het objectvoorvoegsel.
In de praktijk

Hoe Serpent dit voorkomt

Serpent AI brengt de volledige dependency graph in kaart voordat een taak ooit een deploy bereikt, zodat een ontbrekende of hernoemde referentie verschijnt als een scoping-waarschuwing in plaats van een mislukte deployment. Zie de Salesforce-deploymentfoutenbibliotheek voor gerelateerde fouten.

Metadata en data in één deploymentflow in Serpent

Preventie

Verbied hardgecodeerde record-ID's in code review
Behandel elke letterlijke ID van 15 of 18 tekens in Apex, Flow of een formule als een reviewblokkade; los referenties in plaats daarvan op via API-naam, external ID of Custom Metadata Type.
Deploy in expliciete dependency-volgorde, niet alfabetisch of standaard
Definieer een expliciete deployvolgorde voor onderling afhankelijke metadata in plaats van te vertrouwen op de standaardvolgorde die je tooling toevallig produceert.
Zoek naar elke referentie voordat je een API-naam hernoemt
Doorzoek Apex, Flow, formules en layouts op de huidige API-naam van een component voordat je deze hernoemt, zodat er geen verouderde referentie achterblijft.
Veelgestelde vragen

INVALID_CROSS_REFERENCE_KEY, beantwoord

Betekent INVALID_CROSS_REFERENCE_KEY dat ik data ben kwijtgeraakt?
Nee. Het betekent dat de deployment stopte voordat de doel-org werd aangeraakt, omdat een referentie binnen je metadata daar niet kon worden opgelost.
Kunnen sharing settings deze fout veroorzaken, zelfs als het record bestaat?
Ja. Als de uitvoerende gebruiker een record niet kan zien vanwege sharing rules of org-wide defaults, kan Salesforce dit op dezelfde manier behandelen als een werkelijk ontbrekend record.
Gebeurt dit bij standaardvelden, of alleen bij custom velden?
Het kan bij beide gebeuren. Een referentie naar een standaardveld of -record dat de edition of configuratie van de doel-org niet ondersteunt, wordt op dezelfde manier opgelost als een ontbrekend custom component.

Start gratis. Geen creditcard, geen installatie, geen verplichting.

Binnen 15 minuten ingesteld. Geen DevOps-aanwerving nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.