04.07.2004, 12:35 | #1 |
Участник
|
В связи с дикой популярностью вопроса в последнее время, публикую ответ в 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. |
|