Hoe je CANNOT_UPDATE_CONVERTED_LEAD in Salesforce-deployments oplost

Apex- of API-code probeert een Lead bij te werken nadat die al is geconverteerd, en Salesforce blokkeert de schrijfactie.

Treedt op bij: runtime DML, meestal binnen een trigger, batch job, of Apex-test

Wat het betekent

CANNOT_UPDATE_CONVERTED_LEAD treedt op wanneer Apex of een API-aanroep probeert een Lead-record bij te werken dat al is geconverteerd. Zodra een Lead is geconverteerd, wordt die alleen-lezen behalve voor een klein aantal velden die Salesforce nog toestaat, dus elke andere update wordt geweigerd in plaats van stilzwijgend genegeerd.

Het is een runtime-fout, geen deploy-time-fout: de trigger of batch job zelf wordt zonder problemen gedeployed, en de fout verschijnt pas zodra de code daadwerkelijk wordt uitgevoerd tegen een geconverteerd record, vaak binnen de Apex-tests die een productiedeployment vereist.

Diagnose

Veelvoorkomende oorzaken

Trigger of batch job verwerkt Leads zonder IsConverted te controleren
Automatisering werkt Lead-records bulksgewijs bij zonder al geconverteerde records eruit te filteren.
Migratiescript werkt Leads bij zonder geconverteerde records uit te sluiten
Een datamigratie raakt het Lead-object breed en beperkt de update niet tot alleen niet-geconverteerde records.
Race condition tussen query en DML
Een Lead wordt geconverteerd tussen het moment waarop Apex hem opvraagt en het moment waarop dezelfde transactie hem probeert bij te werken.

De oplossing

  1. Filter records met IsConverted = true uit voordat je Leads bijwerkt
    Voeg IsConverted = false toe aan elke query of WHERE-clausule die een bulk Lead-update aanstuurt.
    List<Lead> leads = [
        SELECT Id, Status FROM Lead
        WHERE IsConverted = false AND Id IN :leadIds
    ];
    update leads;
  2. Voeg IsConverted-controles toe aan triggerlogica
    Beveilig Lead-triggerhandlers zodat geconverteerde records worden overgeslagen in plaats van naar de updatelogica te worden doorgestuurd.
  3. Werk in plaats daarvan het resulterende record bij
    Zodra een Lead is geconverteerd, werk je het Contact, Account of Opportunity dat daaruit is ontstaan bij in plaats van de oorspronkelijke Lead.
In de praktijk

Hoe Serpent dit voorkomt

Omdat Serpent bij elke taak de volledige Apex-testsuite draait voordat die mag worden gemerged, faalt een trigger die geconverteerde Leads niet uitfiltert als een testfout op de branch die de fout introduceerde, niet bij een productierelease. Zie de bibliotheek met Salesforce-deploymentfouten.

Metadata en data in één deploymentflow in Serpent

Preventie

Maak IsConverted-filtering een standaard triggerhandler-beveiliging
Voeg de IsConverted-controle toe aan een gedeelde trigger-helper of handler-basisklasse zodat elke Lead-automatisering die erft, in plaats van te vertrouwen op elke ontwikkelaar om eraan te denken.
Dek een geconverteerde Lead af in elke testklasse van een Lead-trigger
Voeg een testmethode toe die een Lead midden in de test converteert en bevestigt dat de trigger deze netjes overslaat, zodat een ontbrekend filter faalt in CI in plaats van in productie.
Beperk bulk Lead-jobs nauwkeurig
Geef batch jobs en migratiescripts een expliciete, nauwe WHERE-clausule in plaats van het hele Lead-object te verwerken.
Veelgestelde vragen

CANNOT_UPDATE_CONVERTED_LEAD, beantwoord

Kan ik nog wel enig veld bijwerken op een geconverteerde Lead?
Een klein aantal velden wel, zoals ConvertedContactId-gerelateerde velden die Salesforce zelf beheert, maar gewone bedrijfsvelden op een geconverteerde Lead zijn vergrendeld.
Geldt dit ook voor het verwijderen van Leads, of alleen voor updates?
Verwijderingen worden apart afgehandeld en zijn over het algemeen toegestaan op geconverteerde Leads als de org-instellingen het verwijderen van Leads überhaupt toestaan; deze specifieke fout gaat over update-achtige DML.
Waarom slaagt dezelfde trigger in een scratch org maar faalt hij in een full sandbox?
De testdata van een scratch org bevat waarschijnlijk geen geconverteerde Leads tenzij de test er expliciet één aanmaakt. Een full sandbox-kopie van productie heeft vrijwel zeker geconverteerde Leads die de bulk job nu raakt.

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

Binnen 15 minuten ingericht. Geen DevOps-medewerker nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.