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.
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

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%'
dava come risultato
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
mentre la query sui docs
SQL
select  [ScopeId],[Id],[SiteId],[DirName],[LeafName],[WebId],[ListId],[DoclibRowId]
from dbo.AllDocs
where DirName like '%IT/Sito/Video%' and LeafName like '%Img1%'
dava come risultato
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
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.
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.

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'
deve ritornare 1 riga con gli stessi dati visti prima.

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'
non deve ritornare niente.

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'
non deve ritornare niente

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'
deve ritornare solo 3 righe, ovvero l'immagine e le due miniature generate da SharePoint.
Potrebbe interessarti anche: