2008-11-11 16 views
1

Je cherche une requête qui fonctionnera sur Sharepoint 2003 pour me montrer tous les documents créés/touchés par un userID donné.Sharepoint: SQL pour trouver tous les documents créés/édités par un utilisateur

J'ai trouvé des tables avec les documents (Docs) et les tables pour les utilisateurs (UserInfo, UserData) mais la relation entre semble un peu étrange - il y a 99 000 enregistrements dans notre table userdata, et 12 000 enregistrements dans userinfo - nous avons 400 utilisateurs!

Je suppose que je m'attendais à une simple relation de 1 à plusieurs avec une table utilisateur ayant 400 enregistrements et de la joindre à la table des documents, mais je vois que ce n'est pas le cas.

Toute aide serait appréciée.

Edit: Merci Bjorn, Je traduis cette requête de retour à la structure 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 

Cela me reçoit une liste des choses de SITEID/listid/de TP_ID Je dois voir si je peux retracez ceux-ci à un nom de fichier/chemin. Tous: toute aide supplémentaire est toujours appréciée!

Répondre

1

Je n'ai jamais regardé la base de données dans SharePoint 2003, mais en 2007, UserInfo est connecté à Sites, ce qui signifie que chaque utilisateur a une ligne dans UserInfo pour chaque collection de sites (ou le concept 2003 équivalent). Donc, pour identifier ce qu'un utilisateur a besoin à la fois l'identifiant du site et l'identifiant de l'utilisateur au sein de ce site. En 2007, je commencerais par quelque chose comme ceci:

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 

Mise à jour: Comme d'autres écrivent ici, il est recommandé de ne pas aller directement dans la base de données de SharePoint, mais je dirais utiliser votre tête et faites attention. Les mises à jour sont toutes non majeures, mais les sélections dépendent du contexte.

1

Si vous souhaitez utiliser cette requête dans Sharepoint, vous devez savoir que créer des vues sur la base de données de contenu ou directement sur la base de données semble être un grand non-non. Une solution de contournement peut être un code personnalisé qui itère à travers le modèle objet et écrit les résultats dans votre propre base de données. Cela peut être soit basé sur un timer ou basé sur un eventtrigger.

1

NE DEMANDEZ PAS LA BASE DE DONNÉES SHAREPOINT DIRECTEMENT!

Je me demande si je l'ai fait assez clair? :)

Vous devez vraiment regarder le modèle objet disponible en C#, vous devez obtenir une instance SPSite pour un SiteCollection, puis parcourir les instances SPList qui appartiennent aux objets SPSite et SPWeb. Une fois que vous avez l'objet SPList, vous devez appeler GetListItems en utilisant une requête qui filtre pour l'utilisateur que vous voulez.

C'est la manière supportée de faire ce que vous voulez. Vous ne devriez jamais aller à la base de données directement car SharePoint n'est pas conçu pour cela et il n'y a aucune garantie (en fait, il y a un avertissement spécifique) que la structure de la base de données sera la même entre les versions et les mises à jour, De plus, lorsque le contenu est réparti sur plusieurs bases de données de contenu dans une batterie de serveurs, il n'y a aucune garantie qu'une requête exécutée sur une base de données de contenu fera ce que vous attendez d'une autre base de données de contenu.Lorsque vous consultez le modèle d'objet pour l'itération, notez également que vous devez disposer() des objets SPSite et SPWeb que vous créez.

Oh, et oui vous pouvez avoir 400 utilisateurs, mais je parie que vous avez 30 sites. L'information est répétée dans la base de données par site ... 30 x 400 = 12 000 entrées dans la base de données.

0

Vous ne devriez vraiment pas faire de SELECT avec des verrous, c'est-à-dire en ajoutant WITH (NOLOCK) à vos requêtes. Certaines parties du système sont très sensibles au délai d'attente et si vous commencez à introduire des verrous que le système ne s'attendait pas, vous pouvez voir le système paniquer. Mais en réalité, vous devriez le faire via le modèle d'objet. Le désordre avec quelque chose comme IronPython et les expérimentations avec l'OM sont presque carrément agréables.

Questions connexes