Pregunta

Estoy buscando una consulta que funcione en Sharepoint 2003 para mostrarme todos los documentos creados / tocados por un ID de usuario determinado.

He encontrado tablas con los documentos (Docs) y tablas para usuarios (UserInfo, UserData) pero la relación entre parece un poco extraña: hay 99,000 registros en nuestra tabla de datos de usuario y 12,000 registros en userinfo, ¡tenemos 400 usuarios!

Supongo que esperaba una relación simple de 1 a muchos con una tabla de usuario con 400 registros y unirla a la tabla de documentos, pero veo que ese no es el caso.

Cualquier ayuda sería apreciada.

Editar: Gracias Bjorn He traducido esa consulta a la estructura de 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

Esto me da una lista de siteid / listid / tp_id que tendré que ver si puedo rastrearlos hasta un nombre de archivo / ruta. Todos: toda ayuda adicional se agradece

¿Fue útil?

Solución

Nunca he visto la base de datos en SharePoint 2003, pero en 2007 UserInfo está conectado a Sitios, lo que significa que cada usuario tiene una fila en UserInfo para cada colección de sitios (o el concepto equivalente de 2003). Por lo tanto, para identificar qué hace un usuario, necesita tanto la identificación del sitio como la identificación del usuario dentro de ese sitio. En 2007, comenzaría con algo como esto:

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

Actualización: como otros escriben aquí, no se recomienda ir directamente a la base de datos de SharePoint, pero yo diría que use su cabeza y tenga cuidado. Las actualizaciones son mayúsculas y no, pero las selecciones dependen del contexto.

Otros consejos

¡NO CONSULTE LA BASE DE DATOS SHAREPOINT DIRECTAMENTE!

Me pregunto si dejé eso lo suficientemente claro. :)

Realmente necesita mirar el modelo de objetos disponible en C #, necesitará obtener una instancia de SPSite para SiteCollection y luego iterar sobre las instancias de SPList que pertenecen a los objetos SPSite y SPWeb.

Una vez que tenga el objeto SPList, deberá llamar a GetListItems mediante una consulta que filtre para el usuario que desee.

Esa es la forma compatible de hacer lo que quieres.

Nunca debe ir directamente a la base de datos, ya que SharePoint no está diseñado para eso y no hay garantía (en realidad, hay una advertencia específica) de que la estructura de la base de datos será la misma entre versiones y actualizaciones, y Además, cuando el contenido se extiende por varias bases de datos de contenido en una granja, no hay garantía de que una consulta que se ejecuta en una base de datos de contenido haga lo que espera en otra base de datos de contenido.

Cuando mira el modelo de objetos para la iteración, también tenga en cuenta que tendrá que deshacerse () de los objetos SPSite y SPWeb que cree.

Ah, y sí, puede tener 400 usuarios, pero apuesto a que tiene 30 sitios. La información se repite en la base de datos por sitio ... 30 x 400 = 12,000 entradas en la base de datos.

Si va a usar esa consulta en Sharepoint, debe saber que crear vistas en la base de datos de contenido o consultar directamente en la base de datos parece ser un gran No-No. Una solución alternativa podría ser algún código personalizado que recorra el modelo de objetos y escriba los resultados en su propia base de datos. Esto podría basarse en el temporizador o en un activador de eventos.

Tampoco deberías hacer SELECTs con bloqueos, es decir, agregar WITH (NOLOCK) a tus consultas. Algunas partes del sistema son muy sensibles al tiempo de espera y si comienza a introducir bloqueos que el sistema no esperaba, puede ver que el sistema se asusta.

Pero realmente, deberías hacerlo a través del modelo de objetos. Meterse con algo como IronPython y experimentar con el OM es casi totalmente agradable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top