Domanda

Sto cercando una query che funzionerà su Sharepoint 2003 per mostrarmi tutti i documenti creati / toccati da un determinato ID utente.

Ho trovato tabelle con i documenti (Documenti) e le tabelle per gli utenti (UserInfo, UserData) ma la relazione tra sembra un po 'strana - ci sono 99.000 record nella nostra tabella di dati utente e 12.000 record in userinfo - abbiamo 400 utenti!

Suppongo che mi aspettassi un semplice rapporto da 1 a molti con una tabella utente con 400 record e che lo unissi alla tabella documenti, ma vedo che non è il caso.

Qualsiasi aiuto sarebbe apprezzato.

Modifica: Grazie Bjorn, Ho tradotto quella query nella struttura di Sharepoint 2003:

select 
d.* from 
userinfo u join userdata d 
on u.tp_siteid = d.tp_siteid  
and 
u.tp_id = d.tp_author 
where
u.tp_login = 'userid' 
and
d.tp_iscurrent = 1

Questo mi dà un elenco di siteid / listid / tp_id che dovrò vedere se riesco a rintracciarli in un nome file / percorso. Tutti: qualsiasi aiuto aggiuntivo è ancora apprezzato!

È stato utile?

Soluzione

Non ho mai guardato il database in SharePoint 2003, ma nel 2007 UserInfo è collegato a Sites, il che significa che ogni utente ha una riga in UserInfo per ogni raccolta siti (o il concetto equivalente 2003). Quindi per identificare ciò di cui un utente ha bisogno sia l'ID del sito che l'ID dell'utente all'interno di quel sito. Nel 2007, inizierei con qualcosa del genere:

select d.* from userinfo u 
join alluserdata d on u.tp_siteid = d.tp_siteid 
and u.tp_id = d.tp_author 
where u.tp_login = '[username]'
and d.tp_iscurrentversion = 1

Aggiornamento: come altri scrivono qui, non è consigliabile andare direttamente nel database di SharePoint, ma direi di usare la testa e fare attenzione. Gli aggiornamenti sono un no-no tutto compreso, ma la selezione dipende dal contesto.

Altri suggerimenti

NON RICHIEDERE DIRETTAMENTE IL DATABASE SHAREPOINT!

Mi chiedo se l'ho chiarito abbastanza? :)

Devi davvero guardare il modello a oggetti disponibile in C #, dovrai ottenere un'istanza SPSite per SiteCollection e quindi scorrere le istanze SPList che appartengono agli oggetti SPSite e SPWeb.

Una volta che hai l'oggetto SPList, dovrai chiamare GetListItems usando una query che filtra per l'utente che desideri.

Questo è il modo supportato di fare ciò che vuoi.

Non dovresti mai andare direttamente al database poiché SharePoint non è progettato per questo e non esiste alcuna garanzia (in realtà, c'è un avviso specifico) che la struttura del database sarà la stessa tra versioni e aggiornamenti, e inoltre, quando il contenuto viene distribuito su più database del contenuto in una farm, non è garantito che una query eseguita su un database del contenuto farà ciò che ci si aspetta su un altro database del contenuto.

Quando guardi il modello a oggetti per l'iterazione, nota anche che dovrai disporre () degli oggetti SPSite e SPWeb che crei.

Oh, e sì, potresti avere 400 utenti, ma scommetto che hai 30 siti. Le informazioni vengono ripetute nel database per sito ... 30 x 400 = 12.000 voci nel database.

Se si intende utilizzare quella query in Sharepoint, è necessario sapere che la creazione di visualizzazioni nel database del contenuto o l'esecuzione di query direttamente sul database sembra essere un grande No-No. Una soluzione alternativa potrebbe essere un codice personalizzato che scorre attraverso il modello a oggetti e scrive i risultati nel proprio database. Potrebbe essere basato su timer o basato su un trigger di evento.

In realtà non dovresti fare SELECTs con Locks, ovvero aggiungere WITH (NOLOCK) alle tue query. Alcune parti del sistema sono molto sensibili al timeout e se inizi a introdurre blocchi che il sistema non si aspettava, puoi vedere il sistema impazzire.

Ma davvero, dovresti farlo tramite il modello a oggetti. Divertiti con qualcosa come IronPython e le sperimentazioni con l'OM sono quasi assolutamente piacevoli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top