Zo los je DELETE_FAILED op bij Salesforce-deployments

Het verwijderen van een record wordt geblokkeerd door een lookuprelatie, een trigger of een lopende goedkeuring, los van de metadata-fout DEPENDENCY_EXISTS.

Treedt op tijdens: runtime DML-verwijderingen, bij data-imports, batchjobs en Apex-tests

Wat het betekent

DELETE_FAILED is een fout op dataniveau die optreedt wanneer een DML-verwijdering niet kan worden voltooid, meestal omdat een ander record nog een lookup- of master-detailverwijzing ernaartoe heeft, een trigger de verwijdering heeft geblokkeerd, of het record vergrendeld is door een lopende goedkeuring. Het geldt voor het verwijderen van records tijdens data-imports en Apex-tests, niet voor het verwijderen van metadatacomponenten.

Master-detail-kindrecords worden automatisch verwijderd wanneer het bovenliggende record wordt verwijderd, dus deze fout gaat vrijwel altijd over een lookuprelatie, waarbij Salesforce de keuze tussen cascaderen of blokkeren aan de configuratie van het veld overlaat, of over custom logica die de verwijdering expliciet stopt.

Diagnose

Veelvoorkomende oorzaken

Kindrecords verwijzen nog via lookup naar het record
Een lookupveld op een ander object verwijst naar het record dat wordt verwijderd, en de relatie is niet ingesteld om automatisch te cascaderen of te wissen.
Een trigger of validatieregel blokkeert de verwijdering
Custom Apex of een validatieregel op het object voorkomt onder bepaalde voorwaarden expliciet het verwijderen, bijvoorbeeld op basis van een statuscontrole.
Record is vergrendeld door een goedkeuringsproces
Het record bevindt zich middenin een goedkeuring, en Salesforce staat niet toe dat je het daaronder vandaan verwijdert.

De oplossing

  1. Verwijder of herplaats eerst kindrecords
    Verwijder of update de lookup op afhankelijke records voordat je het bovenliggende record verwijdert, of stel het veld in op wissen bij verwijdering als dat het juiste gedrag is.
  2. Controleer de logica van triggers en validatieregels
    Zoek naar logica die verwijderen blokkeert in Apex-triggers (trigger.isDelete) en validatieregels die bij verwijdering afgaan.
  3. Annuleer of voltooi lopende goedkeuringen
    Los elk actief goedkeuringsproces op het record op voordat je de verwijdering probeert.
In de praktijk

Hoe Serpent dit voorkomt

De preflightcontroles van Serpent signaleren records en afhankelijke metadata die de datawijzigingen van een taak zouden raken, zodat een geblokkeerde verwijdering aan het licht komt vóór een release in plaats van halverwege een deploy te mislukken. Zie de bibliotheek met Salesforce-deploymentfouten.

No-code CI/CD-pipelinebuilder in Serpent

Preventie

Bepaal het cascadegedrag al bij het ontwerpen van het veld
Kies bewust tussen 'Waarde van dit veld wissen' en 'Verwijderen niet toestaan' bij het aanmaken van een lookup, in plaats van de standaardinstelling de harde weg te ontdekken tijdens een bulkverwijdering.
Omring batchverwijderingen met een afhankelijkheidscontrole vooraf
Bevraag kindrecords en lopende goedkeuringen voordat een bulkverwijderingsjob draait, en sla geblokkeerde bovenliggende records over of rapporteer ze in plaats van de hele batch te laten mislukken.
Documenteer verwijderblokkerende triggers waar dit niet vanzelfsprekend is
Voorzie elke trigger die verwijderingen blokkeert op basis van status of bedrijfsregel van commentaar, zodat toekomstige data-opschoningen niet blind tegen de fout aanlopen.
Veelgestelde vragen

DELETE_FAILED, uitgelegd

Is DELETE_FAILED dezelfde fout als DEPENDENCY_EXISTS?
Nee. DEPENDENCY_EXISTS blokkeert het verwijderen van metadata, zoals een veld of object, omdat andere metadata ernaar verwijst. DELETE_FAILED blokkeert het verwijderen van een datarecord omdat andere records of automatisering ernaar verwijzen.
Waarom lukt het verwijderen van het bovenliggende record soms wel en soms niet bij dezelfde lookup?
Het verwijdergedrag van een lookupveld wordt per veld ingesteld, niet automatisch. Als het is ingesteld op de waarde wissen bij verwijdering, wordt het bovenliggende record probleemloos verwijderd; als het is ingesteld op verwijdering beperken, blokkeert elke kindverwijzing dit.
Telt het verplaatsen van het record naar de prullenbak als verwijderd voor deze controle?
Ja, een soft delete naar de prullenbak activeert nog steeds dezelfde afhankelijkheids- en triggercontroles als een definitieve verwijdering; het record is pas echt weg als de prullenbak wordt geleegd, maar de DELETE_FAILED-controle vindt al plaats bij de soft-delete-stap.

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

Ingericht in minder dan 15 minuten. Geen DevOps-engineer nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.