Hoe je INVALID_FIELD_FOR_INSERT_UPDATE in Salesforce-implementaties oplost

De implementatie probeert te schrijven naar een veld dat niet beschrijfbaar is, zoals een formuleveld of een veld dat de uitvoerende gebruiker niet mag bewerken.

Komt voor tijdens: DML op compile-time of runtime, meestal binnen een Apex-test

Wat het betekent

INVALID_FIELD_FOR_INSERT_UPDATE betekent dat een DML-bewerking, meestal binnen een Apex-test, een waarde probeerde in te stellen op een veld dat niet rechtstreeks beschreven kan worden. Dit gebeurt bij formulevelden, roll-upsamenvattingen en systeemvelden, en ook wanneer Field-Level Security een veld alleen-lezen maakt voor het profiel dat de bewerking uitvoert.

Voor werkelijk niet-beschrijfbare velden zoals formules onderschept Apex dit al bij het compileren als de SObject-literalsyntaxis wordt gebruikt; bij beperkingen door Field-Level Security komt het pas bij runtime aan het licht, omdat dezelfde code voor het ene profiel kan slagen en voor het andere kan mislukken.

Diagnose

Veelvoorkomende oorzaken

Schrijven naar een formule- of roll-upveld
Testdata-factorycode stelt rechtstreeks een waarde in op een veld dat eigenlijk berekend wordt, waardoor het platform de schrijfactie weigert.
Field-Level Security maakt het veld alleen-lezen
Het profiel of de permissieset waarmee de implementatie wordt uitgevoerd heeft geen bewerkingstoegang tot het veld waarnaar wordt geschreven.
Veldtype gewijzigd naar een berekend veld
Een veld dat vroeger bewerkbaar was, is omgezet naar een formuleveld, maar code die er rechtstreeks naar schrijft is nooit bijgewerkt.

De oplossing

  1. Verwijder de directe schrijfactie
    Verwijder de regel testsetupcode die een waarde toewijst aan het formule-, roll-up- of systeemveld.
  2. Verleen bewerkingstoegang als het veld beschrijfbaar moet zijn
    Werk Field-Level Security bij op het profiel of de permissieset die voor de implementatie wordt gebruikt, als het veld daadwerkelijk bewerkbaar moet zijn.
  3. Controleer wijzigingen in veldtype
    Doorzoek na het omzetten van een veld naar een formule de codebase op directe DML-schrijfacties ernaartoe en verwijder ze.
    grep -rn "Amount_Rollup__c\s*=" force-app/main/default/classes/
In de praktijk

Hoe Serpent dit voorkomt

Serpent AI signaleert verschillen in Field-Level Security tussen omgevingen al tijdens de preflight-controle, voordat ze als runtimefout naar voren komen. Zie de bibliotheek met Salesforce-implementatiefouten.

Metadata en data in één deploymentflow in Serpent

Preventie

Doorzoek de codebase voordat je een veld naar een formule omzet
Grep Apex en Flow op directe schrijfacties naar een veld voordat het type wordt gewijzigd, en ruim ze op als onderdeel van dezelfde implementatie.
Houd testdata-factories synchroon met wijzigingen in Field-Level Security
Controleer telkens wanneer de FLS van een veld verandert voor het implementatie- of testuitvoeringsprofiel de testsetupcode die naar dat veld schrijft.
Geef de voorkeur aan schema-gestuurde testfactories boven hardcoded veldlijsten
Bouw testdata via een factory die beschrijfbare velden uit describe-resultaten leest, zodat een wijziging in veldtype vroeg en duidelijk faalt in plaats van stilletjes in productie.
Veelgestelde vragen

INVALID_FIELD_FOR_INSERT_UPDATE, uitgelegd

Waarom gebeurt dit pas sinds een recente implementatie?
Controleer of een veld onlangs is omgezet naar een formule of roll-upsamenvatting. Code die er voorheen rechtstreeks naar schreef, zal vanaf dat moment falen.
Geldt deze fout ook voor systeemvelden zoals CreatedDate?
Ja. Door het systeem beheerde velden zoals CreatedDate, LastModifiedDate en Id kunnen niet rechtstreeks worden beschreven via gewone DML; een klein aantal kan alleen worden ingesteld via speciale API-opties zoals beschrijfbare audit-velden, die de meeste organisaties niet inschakelen.
Heeft 'without sharing' of 'with sharing' invloed op deze fout?
Nee. Sharing-sleutelwoorden bepalen de zichtbaarheid van records, niet de beschrijfbaarheid op veldniveau; een formuleveld is niet beschrijfbaar, ongeacht de sharing-modus van de Apex-klasse.

Begin gratis. Geen creditcard, geen installatie, geen verplichtingen.

In minder dan 15 minuten ingericht. Geen DevOps-aanwerving nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.