So beheben Sie INVALID_FIELD_FOR_INSERT_UPDATE in Salesforce-Bereitstellungen

Die Bereitstellung versucht, in ein nicht beschreibbares Feld zu schreiben, etwa ein Formelfeld oder ein Feld, das der ausführende Benutzer nicht bearbeiten darf.

Tritt auf bei: DML zur Kompilierzeit oder Laufzeit, meist innerhalb eines Apex-Tests

Was das bedeutet

INVALID_FIELD_FOR_INSERT_UPDATE bedeutet, dass eine DML-Operation, meist innerhalb eines Apex-Tests, versucht hat, einen Wert in ein Feld zu schreiben, das nicht direkt beschreibbar ist. Das passiert bei Formelfeldern, Rollup-Summenfeldern und Systemfeldern, und auch dann, wenn die Feldsicherheit (Field-Level Security) ein Feld für das ausführende Profil schreibgeschützt macht.

Bei tatsächlich nicht beschreibbaren Feldern wie Formeln erkennt Apex dies bereits beim Kompilieren, sofern die SObject-Literalsyntax verwendet wird; bei Einschränkungen durch die Feldsicherheit zeigt sich das erst zur Laufzeit, da derselbe Code für ein Profil funktionieren und für ein anderes fehlschlagen kann.

Diagnose

Häufige Ursachen

Schreiben in ein Formel- oder Rollup-Feld
Der Testdaten-Factory-Code weist einem Feld, das tatsächlich berechnet wird, direkt einen Wert zu, weshalb die Plattform den Schreibvorgang ablehnt.
Feldsicherheit setzt das Feld auf schreibgeschützt
Das Profil oder das Berechtigungsset, das die Bereitstellung ausführt, verfügt nicht über Bearbeitungszugriff auf das beschriebene Feld.
Feldtyp in ein berechnetes Feld geändert
Ein zuvor bearbeitbares Feld wurde in ein Formelfeld umgewandelt, aber Code, der direkt hineinschreibt, wurde nie aktualisiert.

Die Lösung

  1. Direkten Schreibzugriff entfernen
    Löschen Sie die Zeile im Test-Setup-Code, die dem Formel-, Rollup- oder Systemfeld einen Wert zuweist.
  2. Bearbeitungszugriff gewähren, falls das Feld beschreibbar sein soll
    Aktualisieren Sie die Feldsicherheit für das Profil oder Berechtigungsset, das für die Bereitstellung verwendet wird, falls das Feld tatsächlich bearbeitbar sein soll.
  3. Feldtypänderungen prüfen
    Durchsuchen Sie nach der Umwandlung eines Felds in eine Formel die Codebasis nach direkten DML-Schreibzugriffen darauf und entfernen Sie diese.
    grep -rn "Amount_Rollup__c\s*=" force-app/main/default/classes/
In der Praxis

Wie Serpent das verhindert

Serpent AI erkennt Abweichungen bei der Feldsicherheit zwischen Umgebungen bereits während der Preflight-Prüfung, bevor sie als Laufzeitfehler auftreten. Siehe die Bibliothek der Salesforce-Bereitstellungsfehler.

Metadaten und Daten in einem einzigen Deployment-Flow in Serpent

Prävention

Codebasis durchsuchen, bevor ein Feld in eine Formel umgewandelt wird
Durchsuchen Sie Apex und Flow nach direkten Schreibzugriffen auf ein Feld, bevor dessen Typ geändert wird, und bereinigen Sie diese im selben Deployment.
Testdaten-Factories mit Änderungen an der Feldsicherheit synchron halten
Überprüfen Sie jedes Mal, wenn sich die Feldsicherheit (FLS) für das Deployment- oder Testausführungsprofil ändert, den Test-Setup-Code, der in dieses Feld schreibt.
Schema-basierte Test-Factories statt fest codierter Feldlisten bevorzugen
Erstellen Sie Testdaten über eine Factory, die beschreibbare Felder aus Describe-Ergebnissen ausliest, damit eine Feldtypänderung früh und deutlich fehlschlägt statt still in der Produktion.
Häufige Fragen

INVALID_FIELD_FOR_INSERT_UPDATE, erklärt

Warum tritt das erst seit einer kürzlichen Bereitstellung auf?
Prüfen Sie, ob ein Feld kürzlich in eine Formel oder Rollup-Summe umgewandelt wurde. Code, der zuvor direkt hineinschrieb, schlägt ab diesem Zeitpunkt fehl.
Gilt dieser Fehler auch für Systemfelder wie CreatedDate?
Ja. Vom System verwaltete Felder wie CreatedDate, LastModifiedDate und Id können nicht direkt über gewöhnliches DML beschrieben werden; einige wenige lassen sich nur über spezielle API-Optionen wie beschreibbare Audit-Felder setzen, die die meisten Orgs nicht aktivieren.
Wirkt sich 'without sharing' oder 'with sharing' auf diesen Fehler aus?
Nein. Sharing-Schlüsselwörter steuern die Sichtbarkeit von Datensätzen, nicht die Beschreibbarkeit auf Feldebene; ein Formelfeld ist unabhängig vom Sharing-Modus der Apex-Klasse nicht beschreibbar.

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.