Skip to content

Suppression forcée d'un dossier média corrompu

Contexte

Dans Umbraco 13, il arrive que certains dossiers médias deviennent impossibles à supprimer via le backoffice.

Symptômes courants :

  • Message d’erreur lors de la suppression d’un dossier média
  • Vidage de la corbeille impossible
  • Erreurs du type :
    • The given key 'XXXX' was not present in the dictionary
    • DELETE statement conflicted with the REFERENCE constraint ...
  • Dossiers dupliqués (Demo, Demo (1), Demo (2), etc.)

Ces problèmes surviennent généralement après :

  • migration Umbraco
  • import média interrompu ou partiel
  • rollback de base de données
  • suppression partielle via API ou script
  • crash pendant un enregistrement média

Dans ces cas, le cache interne d’Umbraco est désynchronisé de la base SQL, et seule une suppression manuelle via SQL permet de corriger l’état.


⚠️ Avertissements importants

Avant toute manipulation :

  • Faire un backup complet de la base de données
  • Travailler idéalement sur un environnement de staging
  • Redémarrer Umbraco après l’exécution du script
  • Ne jamais exécuter ce script sans comprendre quel nodeId est supprimé

Ce script supprime définitivement un dossier média.


Principe technique

En Umbraco 13 :

  • Un dossier média est un Node
  • Il est lié à :
    • umbracoContent
    • umbracoContentVersion
    • umbracoMediaVersion
    • umbracoRelation

Tant qu’une seule de ces tables contient une référence vers le nodeId,
SQL empêche la suppression.

L’ordre de suppression est critique.


Ordre correct de suppression (FK-safe)

  1. umbracoMediaVersion
  2. umbracoContentVersion
  3. umbracoContent
  4. umbracoRelation
  5. umbracoNode

Script SQL paramétrable (recommandé)

Ce script permet de supprimer un dossier média corrompu en respectant toutes les contraintes de clés étrangères.

Utilisation

  • Modifier la valeur de @NodeId
  • Exécuter le script
  • Vérifier que chaque étape affecte des lignes
  • Redémarrer Umbraco

Script complet

sql
BEGIN TRANSACTION;
  
--------------------------------------------------
-- ID du dossier média à supprimer
--------------------------------------------------
DECLARE @NodeId INT = 2090;
  
--------------------------------------------------
-- 1. ContentVersion IDs liés à ce node
--------------------------------------------------
DECLARE @ContentVersionIds TABLE (id INT);
  
INSERT INTO @ContentVersionIds (id)
SELECT id
FROM umbracoContentVersion
WHERE nodeId = @NodeId;
  
--------------------------------------------------
-- 2. Media versions (FK bloquante)
--------------------------------------------------
DELETE FROM umbracoMediaVersion
WHERE id IN (SELECT id FROM @ContentVersionIds);
  
--------------------------------------------------
-- 3. Content versions
--------------------------------------------------
DELETE FROM umbracoContentVersion
WHERE nodeId = @NodeId;
  
--------------------------------------------------
-- 4. Content
--------------------------------------------------
DELETE FROM umbracoContent
WHERE nodeId = @NodeId;
  
--------------------------------------------------
-- 5. Relations
--------------------------------------------------
DELETE FROM umbracoRelation
WHERE parentId = @NodeId
   OR childId  = @NodeId;
  
--------------------------------------------------
-- 6. Node
--------------------------------------------------
DELETE FROM umbracoNode
WHERE id = @NodeId;
  
COMMIT TRANSACTION;

Contributors

The avatar of contributor named as Clément Favre Clément Favre

Changelog