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 dictionaryDELETE 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
nodeIdest 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é à :
umbracoContentumbracoContentVersionumbracoMediaVersionumbracoRelation
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)
umbracoMediaVersionumbracoContentVersionumbracoContentumbracoRelationumbracoNode
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;
