Sharepoint: SQL для поиска всех документов, созданных / отредактированных пользователем

Я ищу запрос, который будет работать на Sharepoint 2003, чтобы показать мне все документы, созданные / затронутые данным идентификатором пользователя.

Я нашел таблицы с документами (Docs) и таблицами для пользователей (UserInfo, UserData), но отношения между ними кажутся немного странными - в нашей таблице userdata есть 99 000 записей и в userinfo 12 000 записей - у нас 400 пользователей!

Я предполагаю, что ожидал простого отношения 1 ко многим с таблицей пользователя, имеющей 400 записей, и присоединением ее к таблице документов, но я вижу, что это не так.

Любая помощь будет оценена.

Редактировать: Спасибо, Бьорн, я перевел этот запрос обратно в структуру 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

Это дает мне список siteid / listid / tp_id, которые мне нужно посмотреть, смогу ли я отследить их до имени файла / пути. Все: любая дополнительная помощь все еще ценится!

4 ответа

Решение

Я никогда не смотрел на базу данных в SharePoint 2003, но в 2007 году UserInfo подключен к сайтам, что означает, что у каждого пользователя есть строка в UserInfo для каждого семейства сайтов (или эквивалентная концепция 2003 года). Таким образом, чтобы определить, что пользователю нужно, вам нужен и идентификатор сайта, и идентификатор пользователя на этом сайте. В 2007 году я бы начал с чего-то вроде этого:

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

Обновление: как пишут здесь другие, не рекомендуется заходить непосредственно в базу данных SharePoint, но я бы сказал, используйте вашу голову и будьте осторожны. Обновления - все без заглавных букв, но выбор зависит от контекста.

Если вы собираетесь использовать этот запрос в Sharepoint, вы должны знать, что создание представлений в базе данных контента или выполнение запросов непосредственно к базе данных - это большой отказ. Обходным решением может быть некоторый пользовательский код, который перебирает объектную модель и записывает результаты в вашу собственную базу данных. Это может быть либо на основе таймера, либо на основе событийного триггера.

НЕ ЗАПРОСИТЕ БАЗУ ДАННЫХ SHAREPOINT ПРЯМО!

Интересно, я сделал это достаточно ясно?:)

Вам действительно нужно взглянуть на объектную модель, доступную в C#, вам нужно будет получить экземпляр SPSite для SiteCollection, а затем перебрать экземпляры SPList, которые принадлежат объектам SPSite и SPWeb.

Получив объект SPList, вам нужно будет вызвать GetListItems, используя запрос, который фильтрует пользователя, которого вы хотите.

Это поддерживаемый способ делать то, что вы хотите.

Вы никогда не должны обращаться к базе данных напрямую, так как SharePoint вообще не предназначен для этого, и нет никакой гарантии (фактически, есть конкретное предупреждение), что структура базы данных будет одинаковой между версиями и обновлениями, а также, когда контент распространяется на несколько баз данных контента в ферме, поэтому нет гарантии, что запрос, выполняемый в одной базе данных контента, будет делать то, что вы ожидаете, в другой базе данных контента.

Когда вы посмотрите на объектную модель для итерации, также обратите внимание, что вам нужно будет утилизировать () созданные вами объекты SPSite и SPWeb.

О, да, у вас может быть 400 пользователей, но я бы поспорил, что у вас есть 30 сайтов. Информация повторяется в базе данных на сайт... 30 x 400 = 12 000 записей в базе данных.

Вы действительно не должны делать SELECT с блокировками, то есть добавлять WITH (NOLOCK) в ваши запросы. Некоторые части системы очень чувствительны к таймауту, и если вы начнете вводить блокировки, которых система не ожидала, вы увидите, что система выходит из строя.

Но на самом деле, вы должны делать это через объектную модель. Возиться с чем-то вроде IronPython, и эксперименты с ОМ почти приятны.

Другие вопросы по тегам