01.07.2010, 08:19 | #1 |
Сам.AX
|
Суммарный RLS запрос в виде SQL
Уважаемые пользователи форума.
Ситуация: Пользователь User1 состоит в группах Group1, Group2, Group3 Для каждой из этих групп настроен RLS на таблицу Table1. Вопрос: Как посмотреть суммарный запрос, который уходит на сервер при запросе пользователем User1 данных из таблицы Table1. Причем нужно сделать это в коде, т.к. нужна информация по всем пользователям-таблицам... Ax 4.0 sp02 Последний раз редактировалось AGRESSOR; 01.07.2010 в 09:48. |
|
01.07.2010, 09:31 | #2 |
Участник
|
Если СУБД MS SQL, то на мой взгляд, удобнее всего воспользоваться профайлером (SQL Server Profiler)
|
|
01.07.2010, 09:53 | #3 |
Сам.AX
|
Профайлером в этом случае думаю удобно воспользоваться в случае с 2-3мя пользователем и 2-3мя таблицами.
А если пользователей 1000? и неизвестно сколько у них пересекающихся в каждой таблице RLS -ов... Хотя может я чего-то о профайлере не знаю =) |
|
01.07.2010, 10:17 | #4 |
Участник
|
Тогда поподробнее о задаче:
- Нужно смотреть в рабочей или тестовой базе ? - Требуется отследить запросы для определенного числа форм/отчетов и т.п. или провести глобальный мониторинг ? - Прочие особенности |
|
01.07.2010, 10:40 | #5 |
Сам.AX
|
1) на рабочей
2) глобальный мониторинг 3) база MS SQL... не знаю что еще дополнить =) |
|
01.07.2010, 10:57 | #6 |
Участник
|
Тогда действительно профайлер не пойдет.
PS. Может попробовать решить задачу как нибудь по другому ? Например для начала получить все возможные комбинации групп RLS для всех пользователей и анализировать уже их. |
|
01.07.2010, 11:22 | #7 |
Сам.AX
|
Ну дак это небольшая проблема: получить пересекающиеся в таблице RLS запросы для каждого пользователя... Вопрос в том, что делать с ними дальше, ведь нужно получить SQL-запрос, пришедший на сервер БД из ядра Аксапты...
|
|
01.07.2010, 18:54 | #8 |
Участник
|
Безумная идея:
В Class/SysQueryRun/new для нужных таблиц добавить range типа X++: strfmt('((DataAreaId == DataAreaId) || (DataAreaId == "%1"))', curuserid()) X++: strfmt('((DataAreaId == DataAreaId) || (TableField == "%1"))', curuserid()) X++: strfmt('((DataAreaId == DataAreaId) || (RecId == %1))', xUserInfo::find().RecId) В профайлере добавить фильтр на текст %DATAAREAID=DATAAREAID% (сомневаюсь, что найдутся еще такие запросы ). PS. По SysQueryRun например тут Не работает RLS по связанной таблице. Так и должно быть? PS2. Реализация и последствия на Вашей совести |
|
|
За это сообщение автора поблагодарили: AGRESSOR (1). |
02.07.2010, 00:15 | #9 |
----------------
|
глупый вопрос.
а какова цель данного исследования? |
|
|
За это сообщение автора поблагодарили: oip (1). |
02.07.2010, 08:43 | #10 |
Сам.AX
|
2 Wamr: Цель - предоставить начальству отчет вида Пользователь-Таблица-Суммарный запрос"
|
|
02.07.2010, 09:42 | #11 |
Участник
|
Цитата:
1. Если босса удовлетворит разграничение в терминах АХ, то можно просто построить запросик по таблицам: - UserInfo - UserGroupList - SysRecordLevelSecurity - может еще что-то 2. Если нужно именно в виде предиката MS SQL, то а. Развертываем копию рабочей базы б. В Class/Info/startupPost добавляем формирование и запуск Query для нужной таблицы с range описанным выше. (не забываем исключить из "праздника" себя любимого ) в. Делаем job/class для запуска в цикле Аксапты под всеми (выбранными) пользователями. (можно использовать за основу Тестирование прав пользователей. DAX 4.0.) г. Настраиваем профайлер на базу и запускаем его. д. Запускаем пункт в е. Выбираем из профайлера получившиеся запросы и парсим их. PS.Вариант 1 мне нравиться гораздо больше |
|
|
За это сообщение автора поблагодарили: mazzy (2), shogel (1), AGRESSOR (1). |
02.07.2010, 10:11 | #12 |
Axapta
|
Цитата:
Цитата:
Если вы пытаетесь разобраться, как что-либо сделать (а не сообщаете об ошибке), начинайте с описания цели. И только потом описывайте конкретный шаг на пути к ней, который вы оне смогли выполнить.
Зачастую люди, которым необходима техническая помощь, имеют на уме высокоуровневую цель и привязываются к одному из возможных, по их мнению, путей ее достижения. Они просят помочь выполнить один шаг, не отдавая себе отчета в том, что выбрали неверный путь. Чтобы разобраться в этом, может потребоваться много усилий. |
|
|
За это сообщение автора поблагодарили: AGRESSOR (1). |
02.07.2010, 10:39 | #13 |
Модератор
|
Если у Вас есть ВНЯТНО спроектированная структура групп пользователей, если RLS группы отделены от групп с правами пользователей, достаточно простого как дверь отчета { Пользователь - Имя - Группа - Описание }. Если нет - наведите таки порядок или продолжайте рожать ежиков
__________________
-ТСЯ или -ТЬСЯ ? |
|
02.07.2010, 10:50 | #14 |
Участник
|
|
|
04.07.2010, 11:18 | #15 |
Модератор
|
А можно с этого места поподробнее? Например, в каких версиях это нельзя сделать?
__________________
-ТСЯ или -ТЬСЯ ? |
|
04.07.2010, 12:31 | #16 |
Участник
|
Цитата:
Приведу пример почему мне больше нравится настройка RLS-прав в AX 4.0. Пример задачи: 1. Менеджеры должны работать с определенными типами объектов. 2. Каждый менеджер может смотреть продажи по определенным регионам. Реализация в AX 4.0: 1. Создаю группу пользователей "Менеджер". Для этой группы настраиваю права доступа. (Права на объекты, не RLS.) 2. Создаю столько столько групп пользователей сколько регионов. Для каждой группы устанавливаю RLS-права на свой регион. 3. Настройка прав менеджера сводится к включению его в группу "Менеджер" и если, например, он может видеть продажи трех регионов, то включение его еще в три группы соответствующих регионов. Реализация в AX 2009 1. Для каждого менеджера создаем отдельную группу. 2. На эту группу настраиваем права. 3. На эту группу настраиваем RLS-права. 4. Включаем менеджера в настроенную группу. Вся соль заключается в поддержке решения. 1. Разрешить менеджерам работать с отчетом "А". В AX 4.0 нужно для группы "Менеджер" дать права на отчет "А". В AX 2009 нужно для группы каждого менеджера добавлять права на отчет "А". 2. Дать конкретному менеджеру права на просмотр продаж по дополнительному региону. В AX 4.0 нужно просто "киинуть" этому пользователю RLS-группу соответствующего региона. В AX 3.0 и 2009 нужно для группы этого менеджера править настройку запроса RLS. Было бы хорошо, если бы когда нибудь дали выбирать администратору какой способ использовать. |
|
|
За это сообщение автора поблагодарили: sukhanchik (6). |
05.07.2010, 06:54 | #17 |
Axapta Retail User
|
_scorp_, немного не поняла, в чем проблема сделать в 3-ке также как вы привели для 4-ки пример?
у нас в 3-й (SP3) сейчас настроено так - есть общая группа "кассир" - где выданы все права на работу с кассами (не RLS). и отдельно группы Касса1 Касса2 Касса3 и т.д. - где права на конкретную кассу (ограничены RLS) все работает отлично. |
|
05.07.2010, 08:48 | #18 |
Участник
|
Поведение тройки, например: Проблема с RLS и SecurityKey.
Про различия 3.0 - 4.0 - 2009 обсуждалось, например, начиная с этого поста: Безопасность на уровне записей
__________________
Ivanhoe as is.. |
|
05.07.2010, 09:00 | #19 |
Сам.AX
|
2 Alexius:
Большое спасибо. За основу взял ваш второй вариант, так как нужен именно SQL-запрос 2 oip, Vadik: Смею предположить, что именно оптимизацией групп и хочет заняться начальство Оффтоп: Сам ненавижу работать без понимания цели, но начальство оно ж Там, а мы тут |
|