So beheben Sie CANNOT_UPDATE_CONVERTED_LEAD in Salesforce-Deployments

Apex- oder API-Code versucht, einen Lead zu aktualisieren, nachdem dieser bereits konvertiert wurde, und Salesforce blockiert den Schreibvorgang.

Tritt auf bei: DML zur Laufzeit, meist innerhalb eines Triggers, Batch-Jobs oder Apex-Tests

Was das bedeutet

CANNOT_UPDATE_CONVERTED_LEAD tritt auf, wenn Apex oder ein API-Aufruf versucht, einen bereits konvertierten Lead-Datensatz zu aktualisieren. Nach der Konvertierung wird ein Lead schreibgeschützt, mit Ausnahme einiger weniger Felder, die Salesforce weiterhin zulässt, sodass jede andere Aktualisierung abgelehnt statt stillschweigend ignoriert wird.

Es handelt sich um einen Laufzeitfehler, keinen Deployment-Fehler: Der Trigger oder Batch-Job selbst wird problemlos deployt, und der Fehler tritt erst auf, wenn der Code tatsächlich gegen einen konvertierten Datensatz ausgeführt wird, häufig innerhalb der Apex-Tests, die ein Produktions-Deployment erfordert.

Diagnose

Häufige Ursachen

Trigger oder Batch-Job verarbeitet Leads ohne IsConverted zu prüfen
Die Automatisierung aktualisiert Lead-Datensätze in großen Mengen, ohne bereits konvertierte Datensätze herauszufiltern.
Migrationsskript aktualisiert Leads, ohne konvertierte auszuschließen
Eine Datenmigration greift breit auf das Lead-Objekt zu und beschränkt die Aktualisierung nicht ausschließlich auf nicht konvertierte Datensätze.
Race Condition zwischen Abfrage und DML
Ein Lead wird konvertiert, zwischen dem Zeitpunkt, zu dem Apex ihn abfragt, und dem Zeitpunkt, zu dem dieselbe Transaktion versucht, ihn zu aktualisieren.

Die Lösung

  1. Datensätze mit IsConverted = true vor dem Aktualisieren von Leads herausfiltern
    Fügen Sie IsConverted = false zu jeder Abfrage oder WHERE-Klausel hinzu, die eine Massenaktualisierung von Leads steuert.
    List<Lead> leads = [
        SELECT Id, Status FROM Lead
        WHERE IsConverted = false AND Id IN :leadIds
    ];
    update leads;
  2. IsConverted-Prüfungen in die Trigger-Logik einbauen
    Sichern Sie Lead-Trigger-Handler so ab, dass konvertierte Datensätze übersprungen werden, statt an die Aktualisierungslogik weitergereicht zu werden.
  3. Stattdessen den resultierenden Datensatz aktualisieren
    Sobald ein Lead konvertiert wurde, aktualisieren Sie den daraus entstandenen Contact, Account oder die Opportunity statt des ursprünglichen Leads.
In der Praxis

Wie Serpent das verhindert

Da Serpent vor jedem Merge die vollständige Apex-Testsuite für jede Aufgabe ausführt, schlägt ein Trigger, der konvertierte Leads nicht herausfiltert, als Testfehler auf dem Branch fehl, der ihn eingeführt hat, nicht erst bei einem Produktions-Release. Siehe die Bibliothek der Salesforce-Deployment-Fehler.

Metadaten und Daten in einem einzigen Deployment-Flow in Serpent

Prävention

IsConverted-Filterung zu einer Standard-Absicherung im Trigger-Handler machen
Fügen Sie die IsConverted-Prüfung zu einem gemeinsamen Trigger-Helper oder einer Handler-Basisklasse hinzu, damit jede Lead-Automatisierung sie erbt, statt sich darauf zu verlassen, dass jeder Entwickler daran denkt.
Einen konvertierten Lead in jeder Testklasse eines Lead-Triggers abdecken
Fügen Sie eine Testmethode hinzu, die einen Lead mitten im Test konvertiert und bestätigt, dass der Trigger ihn sauber überspringt, damit ein fehlender Filter in der CI und nicht in der Produktion fehlschlägt.
Massen-Lead-Jobs eng eingrenzen
Geben Sie Batch-Jobs und Migrationsskripten eine explizite, eng gefasste WHERE-Klausel, statt das gesamte Lead-Objekt zu verarbeiten.
Häufige Fragen

CANNOT_UPDATE_CONVERTED_LEAD, beantwortet

Kann ich überhaupt irgendein Feld auf einem konvertierten Lead aktualisieren?
Eine kleine Anzahl von Feldern, etwa ConvertedContactId-bezogene Felder, die Salesforce selbst verwaltet, aber gewöhnliche Geschäftsfelder auf einem konvertierten Lead sind gesperrt.
Gilt das auch für das Löschen von Leads oder nur für Aktualisierungen?
Löschungen werden separat behandelt und sind bei konvertierten Leads generell erlaubt, sofern die Org-Einstellungen das Löschen von Leads überhaupt zulassen; dieser spezielle Fehler betrifft DML vom Typ Aktualisierung.
Warum besteht derselbe Trigger in einer Scratch-Org, schlägt aber in einer vollständigen Sandbox fehl?
Die Testdaten einer Scratch-Org enthalten wahrscheinlich keine konvertierten Leads, es sei denn, der Test erstellt explizit einen. Eine vollständige Sandbox-Kopie der Produktion enthält fast sicher konvertierte Leads, die der Batch-Job jetzt berührt.

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

Einrichtung in unter 15 Minuten. Keine DevOps-Einstellung nötig.

Neugierig auf schnelleres Shipping, bevor Sie einsteigen? Sprechen wir

Unverbindlich.