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

StackOverflow https://stackoverflow.com/questions/281373

  •  07-07-2019
  •  | 
  •  

Вопрос

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

Я нашел таблицы с документами (Docs) и таблицы для пользователей (UserInfo, UserData) но отношения между ними кажутся немного странными - в нашей таблице данных пользователей 99 000 записей и в пользовательской информации 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, и мне нужно будет посмотреть, смогу ли я отследить их до имени файла/пути.Все:любая дополнительная помощь по-прежнему приветствуется!

Это было полезно?

Решение

Я никогда не просматривал базу данных в SharePoint 2003, но в 2007 году UserInfo подключен к Sites, а это означает, что у каждого пользователя есть строка в 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!

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top