Bon soyons honnêtes, ces pièces jointes orphelines ne pose aucun problème tant que vous n'essayez pas d'exporter votre site en utilisant la commande export de STSADM ou l'API de migration de contenu. Si c'est le cas, vous risquez d'obtenir le message suivant :

FatalError: Cette contrainte ne peut pas être activée, car toutes les valeurs n'ont pas de valeurs parentes correspondantes.
   à System.Data.ConstraintCollection.AddForeignKeyConstraint (ForeignKeyConstraint constraint)
   à System.Data.ConstraintCollection.Add(Constraint constraint, Boolean addUniqueWhenAddingForeign)
   à System.Data.DataRelationCollection.DataSetRelationCollection .AddCore(DataRelation relation)
   à System.Data.DataRelationCollection.Add(DataRelation relation)
   à System.Data.DataRelationCollection.Add(String name, DataColumn parentColumn, DataColumn childColumn)
   à Microsoft.SharePoint.Deployment.FileObjectHelper. GetNextBatch()
   à Microsoft.SharePoint.Deployment.ObjectHelper. RetrieveDataFromDatabase(ExportObject exportObject)
   à Microsoft.SharePoint.Deployment.FileObjectHelper. RetrieveData(ExportObject exportObject)
   à Microsoft.SharePoint.Deployment.ExportObjectManager. GetObjectData(ExportObject exportObject)
   à Microsoft.SharePoint.Deployment.ExportObjectManager. MoveNext()
   à Microsoft.SharePoint.Deployment.ExportObjectManager. ExportObjectEnumerator.MoveNext()
   à Microsoft.SharePoint.Deployment.SPExport.SerializeObjects()
   à Microsoft.SharePoint.Deployment.SPExport.Run()

En anglais ça donne ça :

FatalError: This constraint cannot be enabled as not all values have corresponding parent values.
   at System.Data.ConstraintCollection.Add(Constraint constraint, Boolean addUniqueWhenAddingForeign)
   at System.Data.DataRelationCollection.DataSetRelationCollection .AddCore(DataRelation relation)
   at System.Data.DataRelationCollection.Add(DataRelation relation)
   at System.Data.DataRelationCollection.Add(String name, DataColumn[] parentColumns, DataColumn[] childColumns)
   at Microsoft.SharePoint.Deployment.ListItemObjectHelper. GetNextBatch()
   at Microsoft.SharePoint.Deployment.ObjectHelper. RetrieveDataFromDatabase(ExportObject exportObject)
   at Microsoft.SharePoint.Deployment.ListItemObjectHelper. RetrieveData(ExportObject exportObject)
   at Microsoft.SharePoint.Deployment.ExportObjectManager. GetObjectData(ExportObject exportObject)
   at Microsoft.SharePoint.Deployment.ExportObjectManager. MoveNext()
   at Microsoft.SharePoint.Deployment.ExportObjectManager. ExportObjectEnumerator.MoveNext()
   at Microsoft.SharePoint.Deployment.SPExport.SerializeObjects()
   at Microsoft.SharePoint.Deployment.SPExport.Run()

Pas mieux...

Pour que votre export se déroule sans accroc (et qu'Hannibal Smith soit content), il vous faut supprimer toutes ces pièces jointes orphelines.

- Oui mais, il a pas dit qu'on pouvait plus y faire référence ni par l'interface, ni par le modèle objet ?

Si, si il l'a dit, mais il nous reste toujours...

Tada ! La base de données SharePoint !

"Oh noooooooooon" s'écrient déjà certains qui voient leur garantie et leur support Microsoft s'envoler... Oui c'est vrai, c'est une procédure qui à priori n'est pas supportée par Microsoft, mais faute de mieux on s'en satisfait. Et puis si c'est bien fait c'est pas visible :p Non plus sérieusement j'ai ouvert un ticket à ce sujet mais je n'ai pas encore eu de retour intéressant.


Bon Ok, comment on fait alors ?

Voici tout d'abord un message d'avertissement : La procédure qui suit n'est pas supportée par Microsoft ! Vous utilisez les informations fournies ci-dessous à vos risques et périls.

Pour ceux que ça ne rebute pas, voici la procédure : j'aurais pu vous fournir les requêtes SQL à utiliser mais j'ai fait mieux (enfin je crois), j'ai créé une application WinForm qui va traquer et supprimer (optionnel) les pièces jointes orphelines pour vous ! C'est pas bon ça ? :p

L'application vous permet même de choisir ce que vous souhaitez analyser, depuis toutes les WebApplications, jusqu'à une simple liste en passant par une collection de site ou un site en particulier. Elle est pas belle la vie ? (toute ressemblance avec une pub de Jambon est fortuite...).


Ok, elle est où ton application ?

Dispo sur CodePlex (avec l'aimable autorisation d'Alti) : http://sporphansanalyzer.codeplex.com

Elle est écrite en anglais, car je pense qu'elle pourrait servir à plein de gens (oui je sais c'est prétentieux..), mais que ceux qui sont hermétique à l'anglais se rassurent c'est très simple à comprendre. On choisi ce que l'on veut analyser, on clique sur "Analyze", on attend et voilà ! Si des pièces jointes orphelines sont trouvées un message s'affichera, vous pourrez alors relancer le traitement en cochant la case "remove orphaned attachments" pour supprimer ces éléments automatiquement.

L'application est à faire tourner directement sur un serveur hébergeant SharePoint.

En attendant un patch de Microsoft (on espère), cela vous permettra au moins d'exporter vos sites.

Bon code à tous !