SharePoint:SQL для поиска всех документов, созданных/редактируемых пользователем
-
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 почти совершенно приятно.