……Marco Valli's Blog……

Internet, Tecnologia e SharePoint!!!

Reset dell’ID in una lista di SharePoint 2010


***DISCLAIMER*** questa procedura NON è supportata da Microsoft e la modifica del database SQL pone automaticamente la farm di SharePoint in uno stato NON SUPPORTATO, quindi utilizzate questa guida a solo scopo di test.

Effettuando dei test con su una lista di SharePoint 2010 mi sono chiesto se e come fosse possibile “resettare” il contatore degli id di una lista di SharePoint 2010, la soluzione è arrivata cercando in profondità, nei meandri di SQL.

Ho creato una lista di esempio in un sito di test creato su una virtual machine con installato SQL Server 2008 R2 e SharePoint 2010 Enterprise:

image

Anche il contatore degli elementi mostra la presenza di 10 elementi nella lista:

image

A questo punto comincia la ricerca nei database, naturalmente bisogna conoscere il database del contenuto nel quale è stato salvato il sito, dopodichè si può comporre la prima query da eseguire in SQL Server Management Studio:

SELECT [Id]
      ,[FullUrl]
  FROM [NOME DEL DATABASE].[dbo].[Webs]
  WHERE FullUrl =’NOME DEL SITO

Il nome del sito deve essere inserito senza slash:

es.

Test2 > in caso di subweb

siti/Test2 > in caso di site collection

L’esecuzione della query ci da come risultato l’id univoco del nostro sito:

image

La seconda query da eseguire permette di trovare le informazioni riguardo alla lista di nostro interesse, la query è così strutturata:

SELECT [tp_WebId]
      ,[tp_ID]
      ,[tp_Title]
  FROM [NOME DEL DATABASE].[dbo].[AllLists]
  WHERE tp_WebId = ‘ID DEL SITO RECUPERATO DALLA QUERY PRECEDENTE
  AND  tp_Title = ‘NOME DELLA LISTA

Il nome del database è lo stesso utilizzato nella query precedente, l’id del sito è il valore che è visibile nella colonna “Id” recuperata con la query precedente (in questo caso “0D2B2884-57F3-4BE8-95BA-A93A300E8F99”), il nome della lista è naturalmente quello della lista di nostro interesse (in questo caso “Lista di Esempio”)

Il risultato di questa query fornisce l’id univoco della nostra lista:

image

A questo punto con la prossima query sarà possibile vedere le informazioni tanto desiderate riguardanti la lista di SharePoint…

SELECT TOP 1000 [ListID]
      ,[Modified]
      ,[LastDeleted]
      ,[ItemCount]
      ,[NextAvailableId]
  FROM [NOME DEL DATABASE].[dbo].[AllListsAux]
  WHERE ListID = ‘ID DELLA LISTA RECUPERATO DALLA QUERY PRECEDENTE

Naturalmente anche in questo caso il nome del database è lo stesso utilizzato nella query precedente e il ListID è il valore che è visibile nella colonna “tp_ID” recuperata con la query precedente (in questo caso “23BEA03A-CBAC-4753-B49F-BB5092748CA1”)

Il risultato della query fornisce l’indicazione sul numero degli elementi presenti nella lista i il numero di ID del prossimo elemento che verrà creato nella lista:

image

per fare una verifica “al volo” procedendo con l’eliminazione di 5 elementi ed eseguendo nuovamente la query otterremo questo risultato:

image

Inserendo 5 nuovi elementi invece:

image

image

Esattamente secondo la logica di SharePoint, eliminando 5 elementi, gli ID assegnati agli stessi non verranno mai più utilizzati e quando vengono inseriti 5 nuovi elementi, il contatore per l’ID dell’elemento successivo aumenta fino ad arrivare a 16.

E’ quindi possibile intervenire in questo meccanismo? La risposta è sì, modificando questi valori direttamente dal database ma, prima è necessario provvedere all’eliminazione di TUTTO il contenuto della lista che deve essere eliminato dalla lista, dal cestino di primo livello e anche dal cestino di secondo livello, questa precauzione è per evitare comportamenti imprevisti in caso di ripristino di un item dal cestino nel caso in cui esista un nuovo item a cui è stato assegnato lo stesso ID.

Eseguendo una query di modifica dopo aver effettuato l’accurata “pulizia”:

SELECT     ListID, Modified, LastDeleted, ItemCount, NextAvailableId
FROM         AllListsAux
WHERE     (ListID = ‘ID DELLA LISTA RECUPERATO DALLA QUERY PRECEDENTE‘)

(Il ListID è sempre quello relativo al campo “tp_ID”) si ottiene la possibilità di editare i valori a proprio piacimento potendo così decidere di partire a creare gli elementi nuovamente dall’ID 1:

image

image

Aggiungendo a questo punto nella lista un nuovo item, a questo verrà assegnato nuovamente l’ID numero 1:

image

E naturalmente anche il database riprende a gestire come sempre l’ItemCount ed il NextAvailableId:

image

Diciamo che dopo questo “esperimento” ho potuto constatare che la logica di gestione interna dei database di SharePoint è sicuramente complessa ma, con un po’ di attenzione è decisamente comprensibile…

Enjoy! 😀

Annunci

4 risposte a “Reset dell’ID in una lista di SharePoint 2010

  1. Ben 20 luglio 2011 alle 17:50

    Ciao , hai mai provato se la logica è la stessa anche con Sharepoint 2007 (che è purtroppo il mio caso…)?
    Grazie

    • Marco Valli 25 luglio 2011 alle 15:05

      Ciao, il funzionamento dovrebbe essere assolutamente identico in SharePoint 2007, l’unica differenza è che nel content db della versione 2007 non esiste la tabella “AllListAux” ma le informazioni riguardo all’ID dell’elemento successivo ed al conteggio degli elementi si trovano direttamente nella tabella “AllList” le due colonne si chiamano tp_ItemCount e tp_NextAvailableId.. Spero di esserti stato d’aiuto!
      Marco

  2. Duane 12 luglio 2013 alle 04:30

    I think everything posted was very reasonable. But, consider this, suppose you were to create a killer headline?
    I ain’t suggesting your information isn’t solid, but suppose you added a title that grabbed people’s attention? I mean Reset dell’ID in una lista
    di SharePoint 2010 | ……Marco Valli’s Blog…… is kinda vanilla. You might peek at Yahoo’s home page and note how they write post headlines to get viewers to
    open the links. You might try adding a video or a pic
    or two to get readers interested about everything’ve got to say. In my opinion, it would make your website a little livelier.

    • Marco Valli 12 luglio 2013 alle 11:18

      This article contains 12 screenshots of the various steps to be made, I think it’s more than enough to make the process understandable, surely if I have time I will try to make it more rich even if my purpose is not “attract visitors,” because I do not gain absolutely nothing and I do it only for passion.

      Thanks for the tip!
      Marco

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: