Forum de discussion attention aux pièces jointes orphelines... (Application CodePlex inside...) MAJ 02/12/09
Par Edgar le dimanche 29 novembre 2009, 17:59 - SharePoint 2007 - Lien permanent
Bonjour à tous,
EDIT 02/12/2009 : La CU
d'Octobre semble régler ce problème, cependant je n'ai pas encore testé ce
patch, et je ne sais pas si une fois appliqué cela supprime toutes les pièces
jointes orphelines existantes ou si cela permet juste de ne plus en créer, pour
plus d'infos : http://support.microsoft.com/kb/975002/en-us
(3ème puce)
En travaillant sur un projet pour Alti (www.alti.fr, un peu de pub ça ne fait jamais de mal...), je me suis rendu compte que lorsque l'on supprime un sujet de discussion dans un forum sur un site SharePoint, les pièces jointes associées à ce sujet ne sont pas supprimées ! Elles deviennent des pièces jointes orphelines, et il n'est pas plus possible de les supprimer par l'interface utilisateur ou le modèle objet.
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 !