Impossibile cancellare un immagine in SharePoint 2010
Su una image gallery di SharePoint 2010, mi è capitato di ritrovarmi con un immagine in cui non si vedeva la miniatura dell'immagine inserita e non era possibile ne editarla ne cancellarla.
Il tentativo di sovrascriverla facendo l'aupload di un file con lo stesso nome ha peggiorato la situazione e mi sono ritrovato con due elementi con lo stesso nome non più eliminabili.
Il tentativo successivo è stato quello di cercare di risolvere la situazione via codice con PowerShell cercando di eliminarlo o di aggiungere dei permessi.
Qualsiasi azione di update riportava un errore come questo:
l'errore mi è uscito facendo un update con il codice seguente:
In pratica nessuna azione fatta da interfaccia utente o via codice permetteva di risolvere il problema, anche usando utenti con elevati privilegi (ad esempio System Account).
Non restava che andare sul database di content.
Facendo delle query sulle tabelle Perms e AllDocs risutavano delle righe orfane. In pratica non c'era più l'associazione tra l'immagine, con relative miniature, e la riga dei permessi.
La query sui permessi
dava come risultato
mentre la query sui docs
dava come risultato
come si può vedere dai risultati il campo ScopeId nelle due tabelle non coincideva.
E' bastato copiare il campo ScopeId della tabella AllDocs nel campo ScopeId della tabella Perms per ripristinare la situazione corretta.
In ogni caso prima di procedere conviene fare una query incrociata con gli ScopeId per vedere se la situazione è coerente e non ci sono altri elementi con quegli ScopeId.
La query sui permessi con lo ScopeId preso da Perms
deve ritornare 1 riga con gli stessi dati visti prima.
Lo stesso id sulla AllDocs
non deve ritornare niente.
Vanno poi rifatte le stesse query usando lo ScopeId preso dalla AllDocs
non deve ritornare niente
Lo stesso id sulla AllDocs
deve ritornare solo 3 righe, ovvero l'immagine e le due miniature generate da SharePoint.
Il tentativo di sovrascriverla facendo l'aupload di un file con lo stesso nome ha peggiorato la situazione e mi sono ritrovato con due elementi con lo stesso nome non più eliminabili.
Su questa doclib era applicato un event handler per la gestione dei permessi sul singolo item
Il tentativo successivo è stato quello di cercare di risolvere la situazione via codice con PowerShell cercando di eliminarlo o di aggiungere dei permessi.
Qualsiasi azione di update riportava un errore come questo:
Exception calling "Update" with "0" argument(s): "<nativehr>0x80070005</nativeh
r><nativestack></nativestack>"
At line:1 char:13
+ $item.Update <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
r><nativestack></nativestack>"
At line:1 char:13
+ $item.Update <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
l'errore mi è uscito facendo un update con il codice seguente:
PowerShell
$w = Get-SPWeb http://sharepoint2010/IT/Sito
$w.Url
# output: http://sharepoint2010/IT/Sito
$l = $w.Lists["Video"]
$l.RootFolder.Url
# output: Video
$l.RootFolder.ServerRelativeUrl
# output: /IT/Sito/Video
$item = $l.GetItemById(23)
$item.Url
# output: Video/Img1.jpg
$item.RoleAssignments
# output: niente
$item.Update()
In pratica nessuna azione fatta da interfaccia utente o via codice permetteva di risolvere il problema, anche usando utenti con elevati privilegi (ad esempio System Account).
Non restava che andare sul database di content.
Facendo delle query sulle tabelle Perms e AllDocs risutavano delle righe orfane. In pratica non c'era più l'associazione tra l'immagine, con relative miniature, e la riga dei permessi.
La query sui permessi
SQL
select [SiteId],[ScopeId],[RoleDefWebId],[WebId],[DelTransId],[ScopeUrl],[AnonymousPermMask],[Acl]
from Perms
where ScopeUrl like '%IT/Sito/Video/Img1.jpg%'
Text
[SiteId] [ScopeId] [RoleDefWebId] [WebId] [DelTransId] [ScopeUrl] [AnonymousPermMask] [Acl]
8D48F764-2B4C-46EB-AD8C-853519C5C782 64673C1B-9478-4E0E-9CC1-1BBBE4245A46 8CF69E4C-BF87-4C76-BF58-B0F032D04FEA 8F9C4535-5D7F-4535-83AD-E61111B61298 0x IT/Sito/Video/Img1.jpg 0 0xF3FE000001000000000000000300000004000000FFFFFFFFFFFFFF7F06000000EF12433CB0010000320000000100030810000000
SQL
select [ScopeId],[Id],[SiteId],[DirName],[LeafName],[WebId],[ListId],[DoclibRowId]
from dbo.AllDocs
where DirName like '%IT/Sito/Video%' and LeafName like '%Img1%'
Text
[ScopeId] [Id] [SiteId] [DirName] [LeafName] [WebId] [ListId] [DoclibRowId]
3EAF57D1-56C6-40B1-A96C-A73E6F556EBB E311956E-AE66-4F4B-9003-95AF858C2890 8D48F764-2B4C-46EB-AD8C-853519C5C782 IT/Sito/Video Img1.jpg 8F9C4535-5D7F-4535-83AD-E61111B61298 157E8801-CCEA-40DB-9A78-74AF52C75E0D 27
3EAF57D1-56C6-40B1-A96C-A73E6F556EBB 203D007C-E91A-4CBB-9471-0FCF75790AB4 8D48F764-2B4C-46EB-AD8C-853519C5C782 IT/Sito/Video/_t Img1_jpg.jpg 8F9C4535-5D7F-4535-83AD-E61111B61298 157E8801-CCEA-40DB-9A78-74AF52C75E0D NULL
3EAF57D1-56C6-40B1-A96C-A73E6F556EBB 964D2BCD-7D8D-4419-A099-815DF5D32833 8D48F764-2B4C-46EB-AD8C-853519C5C782 IT/Sito/Video/_w Img1_jpg.jpg 8F9C4535-5D7F-4535-83AD-E61111B61298 157E8801-CCEA-40DB-9A78-74AF52C75E0D NULL
E' bastato copiare il campo ScopeId della tabella AllDocs nel campo ScopeId della tabella Perms per ripristinare la situazione corretta.
La modifica diretta del databse di content non è supportata da Microsoft, quindi qualunque modifica la fai a tuo rischio e pericolo.
Ti consoglio di fare una prova restorando il DB di produzione su un server di test.
Ti consoglio di fare una prova restorando il DB di produzione su un server di test.
In ogni caso prima di procedere conviene fare una query incrociata con gli ScopeId per vedere se la situazione è coerente e non ci sono altri elementi con quegli ScopeId.
La query sui permessi con lo ScopeId preso da Perms
SQL
select [SiteId],[ScopeId],[RoleDefWebId],[WebId],[DelTransId],[ScopeUrl],[AnonymousPermMask],[Acl]
from Perms
where ScopeId = '64673C1B-9478-4E0E-9CC1-1BBBE4245A46'
Lo stesso id sulla AllDocs
SQL
select [ScopeId],[Id],[SiteId],[DirName],[LeafName],[WebId],[ListId],[DoclibRowId]
from dbo.AllDocs
where ScopeId = '64673C1B-9478-4E0E-9CC1-1BBBE4245A46'
Vanno poi rifatte le stesse query usando lo ScopeId preso dalla AllDocs
SQL
select [SiteId],[ScopeId],[RoleDefWebId],[WebId],[DelTransId],[ScopeUrl],[AnonymousPermMask],[Acl]
from Perms
where ScopeId = '3EAF57D1-56C6-40B1-A96C-A73E6F556EBB'
Lo stesso id sulla AllDocs
SQL
select [ScopeId],[Id],[SiteId],[DirName],[LeafName],[WebId],[ListId],[DoclibRowId]
from dbo.AllDocs
where ScopeId = '3EAF57D1-56C6-40B1-A96C-A73E6F556EBB'