AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Администрирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.07.2004, 12:35   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
В связи с дикой популярностью вопроса в последнее время, публикую ответ в FAQ.

Вопрос: Как в Аксапте физически реализован RLS (Record Level Security - ограничение доступа на уровне записей)?

Ответ: В Аксапте в запросы по таблицам, на которые настроен RLS, добавляются условия из RLS.
Так например, выглядит запрос по таблице клиентов в обычном виде
[sql]SELECT <<fieldList>>
FROM CUSTTABLE A
WHERE (DATAAREAID=@P1) ORDER BY A.DATAAREAID,A.ACCOUNTNUM OPTION(FAST 1)[/sql]
где DATAAREAID - это разделитель компаний.

А так после наложения двух условий в две группы. Пользователь входит в обе группы.
Первый критерий был задан на группу клиентов как 'ТиУ', второй - 'ПРЧ'.
Обратите внимание, что константы, как обычно, как передаются в параметрах.
И как обычно запрос запоминается в хранимой процедуре, а впоследствии многократно используется.
[sql]SELECT <<fieldList>>
FROM CUSTTABLE A
WHERE (
(DATAAREAID=@P1) AND (
(CUSTGROUP=@P2) OR (CUSTGROUP=@P3)
)
) ORDER BY A.DATAAREAID,A.ACCOUNTNUM OPTION(FAST 1)[/sql]

Если пользователь накладывает свои условия в фильтре, то пользовательские условия добавляются через AND.
Я наложил критерий на наименование '!а*, б*'.
[sql]SELECT <<fieldList>>
FROM CUSTTABLE A
WHERE (
(DATAAREAID=@P1) AND (
(
NOT (({fn ifnull({fn LTRIM(ACCOUNTNUM)},ACCOUNTNUM)} LIKE @P2 ESCAPE ''\'' )) OR ({fn ifnull({fn LTRIM(ACCOUNTNUM)},ACCOUNTNUM)} LIKE @P3 ESCAPE ''\'' )
) AND (
(CUSTGROUP=@P4) OR (CUSTGROUP=@P5)
)
)
) ORDER BY A.DATAAREAID,A.ACCOUNTNUM OPTION(FAST 1)'[/sql]

Обратите внимание, что у таблицы CustTable установлен режим кэширования notInTTS. Это значит, что вне транзакций, Аксапта пользуется значениями из кэша. Для того, чтобы увидеть этот запрос не перезагружая Аксапту, измените свойство CacheLookup у таблицы CustTable. Если у вас нет средств разработки, просто возьмите другую таблицу для экспериментов. Например CustTrans.
__________________
полезное на axForum, github, vk, coub.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:04.