Sharepoint: SQL для поиска всех документов, созданных / отредактированных пользователем - PullRequest
1 голос
/ 11 ноября 2008

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

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

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

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

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

1 голос
/ 22 ноября 2008

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

1 голос
/ 22 ноября 2008

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

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

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

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

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

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

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

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

1 голос
/ 12 ноября 2008

Я никогда не смотрел на базу данных в 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, но я бы сказал, используйте вашу голову и будьте осторожны. Обновления - все без заглавных букв, но выбор зависит от контекста.

0 голосов
/ 22 июля 2009

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

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

...