SharePoint [MissingWebPart] WebPart class
L'errore riportato indica che in SharePoint 2010 / 2013 / 2016 non è più registrata correttamente la WebPart indicata dal guid (30B9CA5C-5DF8-472B-BF14-8C2B3A15D553) ma ci sono N riferimenti (32) nel database (SP2013_Content):
La soluzione più ovvia è reinstallare la feature che conteneva la WebPart.
Se questo non è possibile, si può procedere con la cancellazione dei riferimenti.
Per trovare in quali pagine è referenziata la WebPart si può usare questa query SQL sul database di content:
ritorna un elenco di righe dove nel campo DirName e LeafName è indicato, rispettivamente, il percorso e il nome del file.
Una volta eliminati tutti i riferimenti, rimuovere le pagine anche dal cestino utente e da quello amministrativo di site collection (secondo livello).
Per verificare se ci sono ancora segnalazioni, si può usare il comando PowerShell:
oppure andare nella Central administration http://<indirizzo ca>:<porta>/Lists/HealthReports/AllItems.aspx
Se non si ha accesso diretto al database ma si hanno i permessi di lettura, si può eseguire questo PowerShell per eseguire la query precedente
[MissingWebPart] WebPart class [30B9CA5C-5DF8-472B-BF14-8C2B3A15D553] (class [SurveyWebpart.Survey] from assembly [SurveyWebpart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9504ca020aabc73]) is referenced [32] times in the database [SP2013_Content], but is not installed on the current farm. Please install any feature/solution which contains this web part. One or more web parts are referenced in the database [SP2013_Content], but are not installed on the current farm. Please install any feature or solution which contains these web parts.
La soluzione più ovvia è reinstallare la feature che conteneva la WebPart.
Se questo non è possibile, si può procedere con la cancellazione dei riferimenti.
Per trovare in quali pagine è referenziata la WebPart si può usare questa query SQL sul database di content:
SQL
USE SP2013_Content
SELECT *
FROM AllDocs
INNER JOIN AllWebParts ON AllDocs.Id = AllWebParts.tp_PageUrlID
WHERE AllWebParts.tp_WebPartTypeID ='30B9CA5C-5DF8-472B-BF14-8C2B3A15D553'
Per capire se la pagina e attiva, una versione precedente o nel cestino, fare riferimento ai campi tp_IsCurrentVersion, tp_PageVersion e tp_Deleted
A questo punto la WebPart potrebbe essere presente:- direttamente sulla pagina
- su una sua precedente versione (nel caso fosse attivo il versioning / history)
- nel cestino
Una volta eliminati tutti i riferimenti, rimuovere le pagine anche dal cestino utente e da quello amministrativo di site collection (secondo livello).
Per verificare se ci sono ancora segnalazioni, si può usare il comando PowerShell:
PowerShell
Test-SPContentDatabase SP2013_Content
Se non si ha accesso diretto al database ma si hanno i permessi di lettura, si può eseguire questo PowerShell per eseguire la query precedente
PowerShell
#nome server o alias
$sqlServer = "...nome del server e/o istanza..."
$database = "...nome del database..."
$id = "...guid da cercare..."
$query = "SELECT * FROM AllDocs INNER JOIN $database..AllWebParts ON AllDocs.Id = AllWebParts.tp_PageUrlID WHERE AllWebParts.tp_WebPartTypeID ='$id'"
$cnn = "server=$sqlServer;database=$database;Integrated Security=sspi"
#$cnn = "server=$sqlServer;database=$database;User ID=myUsername;Password=myPassword;Trusted_Connection=False;"
$da = new-object System.Data.SqlClient.SqlDataAdapter($query, $cnn)
$tbl = new-object System.Data.DataTable
$count = $da.fill($tbl)
$da.dispose()
#return data
Write-Host "Record letti: $count" -ForegroundColor Green
$tbl
#visualizzo il risultato in una finestra
$tbl | Out-GridView