Как сделать самодельные представления для таблиц Lotsia PDM?

Обсуждение технических вопросов работы с системами управления базами данных (СУБД), работе с языком SQL и скриптовыми языками.
Ответить
Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Как сделать самодельные представления для таблиц Lotsia PDM?

Сообщение Anderyt »

Коллеги, помогите разобраться плиз.

после очередного написания прямого запроса к БД для использования его в отчете я заметил, что после замены таблиц на виды (чтобы юзеры могли пользоваться этим запросом) производительность жутко снизилась. после консультаций с Теххелпом я точно узнал то, о чем давно подозревал. оказывается, при работе с видами проверяются РЕАЛЬНЫЕ права пользователя на ту или иную информацию. это, кстати, видно, если посмотреть запрос, который формирует вид...

но иногда возникают такие ситуации, что пользователю нужно обратиться к такой информации, которая или 100% доступна конкретно ему, или почти 100% доступна всем на просмотр. в любом случае, пока среди такой информации нету каких то там коммерческих или гос-х тайн.. и это надо сделать как можно быстрее..

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

в случае с админом использование самодельного вида привело к значительному сокращению времени, и все было бы просто прекрасно, отчет формируется моментально.. но когда дошел до тестирования от имени юзера - та же самая проблема, нет достаточных прав. в этом виде есть обращения к таблицам, а не к видам.. но в "родных" видах тоже используются имена таблиц, и все работает.. в чем может быть дело?

права на сам по себе вид я дал... и в ошибке конкретно сказано про ту таблицу, на которую ссылается созданный вид..

кто-нибудь работал с самодельными видами в Lotsia PDM? поделитесь опытом, пожалуйста.. или советом..
Теххелп больше не желает говорить мне ничего, кроме "Обратитесь, пожалуйста, к документации по MS SQL Server." :-(
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

в голову приходит только- спросить на sql.ru, если конечно прорвешся через местных монстров :wink: (вопросы гасят с ходу посылая всех в BOL) :?

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

да уж, кстати, Теххелп тоже "страдает" такой привычкой, посылать на эти три буквы... я, конечно, имею в виду BOL... :oops:
они мне вчера прислали цитату из БОЛов (что уже очень приятно и полезно :-) ):
A user who creates a view or stored procedure that depends on an object owned by another user must be aware that any permissions he or she grants depend on the permissions allowed by the other owner.
я так понимаю, что проблема здесь в том, что таблицы и виды созданы разными юзерами... Сиквел просто говорит, что он вовсе не обязан давать доступ к объектам другого пользователя, и все..
сейчас жду ответа от Теххелпа, как создать вид от имени юзера lsdbo...
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

может не к месту, но в своих выпадающих списках я делал таблицу свободных id с правами lsdbo+хп с правами lsdbo + хп с правами lsdbo+party
И юзер вызывая последнюю хп оперировал в конечном счете с таблицей & хп на которые прав у него нет, может и здесь сделать что-то подобное? :roll:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

решение найдено! :-)
помогла цитата из BOL, которую прислал теххелп. я нашел эту цитату в BOL и почитал немного о права на виды и таблицы.
дело оказалось в том, что для того, чтобы юзерам не нужны были права на таблицы, на которые ссылается вид, этот вид должен быть СОЗДАН тем юзером, кто владеет нужными таблицами. иначе получается дыра в безопасности - мы можем сделать вид, который оперирует данными в таблицах, на которые у нас нет прав, и спокойно пользоваться им, получая доступ к закрытым ранее данным. а если мы создаем вид на те таблицы, которыми сами же и владеем, то это уже наше дело, мы сами несем за это ответственность и сиквел-сервер послушно открывает используемые таблицы для того, у кого есть право на пользование созданным видом.. это я так понял.

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

Код: Выделить всё

CREATE VIEW LSDBO.custom_view_last_docs_v
AS
SELECT     (SELECT     id
                       FROM          lsdbo.object_reference obj
                       WHERE      id IN
                                                  (SELECT     object_reference_id
                                                    FROM          lsdbo.file1 file1
                                                    WHERE      id IN
                                                                               (SELECT     file_id
                                                                                 FROM          lsdbo.file_ver file_ver
                                                                                 WHERE      file_ver.id = file_log.file_ver_id))) AS isobject_id,
                          (SELECT     mnemo
                            FROM          lsdbo.object_type obj_type
                            WHERE      id =
                                                       (SELECT     type_id
                                                         FROM          lsdbo.object_reference obj
                                                         WHERE      id IN
                                                                                    (SELECT     object_reference_id
                                                                                      FROM          lsdbo.file1 file1
                                                                                      WHERE      id IN
                                                                                                                 (SELECT     file_id
                                                                                                                   FROM          lsdbo.file_ver file_ver
                                                                                                                   WHERE      file_ver.id = file_log.file_ver_id)))) AS mnemo,
                          (SELECT     description
                            FROM          lsdbo.object_reference obj
                            WHERE      id IN
                                                       (SELECT     object_reference_id
                                                         FROM          lsdbo.file1 file1
                                                         WHERE      id IN
                                                                                    (SELECT     file_id
                                                                                      FROM          lsdbo.file_ver file_ver
                                                                                      WHERE      file_ver.id = file_log.file_ver_id))) AS obj_desc,
                          (SELECT     vs.value
                            FROM          lsdbo.attrib_value av, lsdbo.value_string vs
                            WHERE      av.attrib_id = - 28 AND av.value_id = vs.id AND av.object_id IN
                                                       (SELECT     object_reference_id
                                                         FROM          lsdbo.file1 file1
                                                         WHERE      file1.id IN
                                                                                    (SELECT     file_id
                                                                                      FROM          lsdbo.file_ver file_ver
                                                                                      WHERE      file_ver.id = file_log.file_ver_id))) AS indication,
                          (SELECT     description
                            FROM          lsdbo.file1 file1
                            WHERE      file1.id IN
                                                       (SELECT     file_id
                                                         FROM          lsdbo.file_ver file_ver
                                                         WHERE      id = file_log.file_ver_id)) AS doc_desc, user_id, state AS acc_type, cd
FROM         LSDBO.File_Log file_log
WHERE     (state IN ('V', 'A', 'C', 'I')) AND (cd >= DATEADD(month, - 1, GETDATE()))
небольшой комментарий.
колонки вида:
isobject_id - ИД объекта, в котором есть нужный нам документ (колонка используется для перехода к объекту из отчета);
mnemo - мнемо типа этого же объекта (нужна чтобы нарисовать иконку объекта в отчете.. чтобы было красивее и привычнее);
obj_desc - описание этого же объекта;
indication - атрибут с ИД -28 (можно конечно сделать любой другой атрибут);
doc_desc - описание документа;
user_id - тот пользователь, у которого был доступ к документу;
acc_type - тип доступа к документу;
cd - дата и время доступа;

для скорости сделано одно допущение - в этот вид попадают только те факты доступа к документам, которые имели место в течение 1-го месяца с текущей даты (назад во времени, конечно :-) )

при использовании этого вида в отчете для каждого пользователя можно сделать дополнительное условие фильтрации типа

Код: Выделить всё

where user_id = :user_id
где :user_id аргумент отчета, который по умолчанию равен ИД текущего юзера
чтобы уменьшить объем данных в отчете, можно добавить после SELECT оператор TOP xx, я себе поставил TOP 50, и это это многовато :-)
и в итоге то, ради чего это все делалось.. этот отчет появляется через 2-3 секунды после нажатия на кнопку "последние документы" на форме объекта. и причем в это время постоянно что то происходит на экране - запускается действие, запускается отчет, который тут же заполняется данными! :-) со стороны выглядит как моментальное получение списка документов :-)
а раньше, когда было обращение к родным видам, окошко отчета держалось пустым секунды три...
вот такие дела... надо подумать, как этот опыт использовать дальше...
но получается конечно определенная дырка в защите данных, о чем теххелп меня сразу предупредил. если использовать собственные виды, в которых нет проверки прав, то пользователь, используя эти виды, может получить доступ к той информации, к которой бы он не добрался в интерфейсе Лоции.. об этом надо помнить.
лучше день потерять, потом за пять минут долететь!
Ответить