RLS - дубли условий в запросах к СУБД

07.10.19

Администрирование - Роли и права

"Подводные камни", возникающие при бездумном копировании ролей с ограничениями RLS, как это отражается на производительности, разбор примера и инструмент для анализа.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
RLS - дубли условий в запросах: тестовая конфигурация
.dt 48,78Kb
3
3 Скачать (1 SM) Купить за 1 850 руб.
RLS - дубли условий в запросах к СУБД: обработка Анализ ролей RLS
.epf 8,72Kb
43
43 Скачать (1 SM) Купить за 1 850 руб.

 

Для тех, кто не в курсе

RLS или Record Level Security или Доступ на уровне записи, механизм призванный сделать оптимальным процесс ограничения доступа к данным в зависимости от их наполнения, например, в документе один из реквизитов - филиал, при настройке ограничений RLS, можно ограничить просмотр документов с определенным составом филиалов для каждого пользователя индивидуально.

Как-то недавно на базе 1С:ЗУП, немного доработанной, я столкнулся с ошибкой, когда MSSQL Server отказался формировать запрос ввиду его большого размера. Анализ показал, что 1С действительно формирует огромный запрос, более 1000 строк (сейчас точнее уже не помню) и весомую часть запроса составляли добавленные ограничения RLS. Базу дорабатывало крупное франчайзи и специалисты у них неплохие, однако и они "наступили на грабли".

 

Тестовый пример

Для теста написана простая конфигурация, справочники:

  • "Филиалы"
  • "Пользователи" (Табличная часть "ФилиалыРазрешенные", в ней реквизит "Филиал" для установки пользователю разрешенных филиалов)

документ:

  • "Передача денег", реквизиты "Филиал", "Сумма"

роли:

  • "Полные права" - без ограничений RLS 
  • "Бухгалтер", "ИЗМ_Бухгалтер", "ИЗМ_БухгалтерПоФилиалам" имеют идентичное по смыслу ограничение RLS по филиалам на чтение документа "Передача денег", в каждой RLS-роли добавлено незначительное изменение (Условие 1 = 1, 2 = 2 и т.д.).

Пользователь с ограниченными правами, будет видеть только документы разрешенных ему филиалов. В качестве теста будем использовать форму списка вышеуказанного документа, будем ее обновлять по F5 и смотреть трассировку запросов в SQL Profiler. 

 
 Скрины тестовой конфигурации

 

SQL - запрос здорового человека админа - роль ПолныеПрава, органичений RLS нет

На скрине видно, что никаких ограничений про филиалам нет

 

SQL - запрос курильщика пользователя с одной ролью RLS, ограничение по списку филиалов для пользователя

В данном случае пользователю назначена одна роль "Бухгалтер", видим отсечение записей через EXISTS:

 

SQL - запрос заядлого курильщика пользователя с тремя дублирующими ролями RLS, ограничение как в предыдущей теме

Пользователю добавлены роли "ИЗМ_Бухгалтер", "ИЗМ_БухгалтерПоФилиалам", итого 3 роли с RLS, обратите внимание, что EXISTS-ы соединяются через OR, как и задумано платформой. Для реализации этого примера, ограничения RLS в ролях были дополнены пустыми условиями 1 = 1, 2 = 2 и т.д. , это для теста, а в жизни могут отредактировать существующее условие или дописать новое.

 

Ложка дегтя

Как такое получается в жизни? Очень просто, для пользователя надо модифицировать права, скопировали роль, подправили RLS, в результате, никто не отменил ранее установленные роли у пользователя, а платформа формируя запрос, собрала почти идентичные условия со всех трех ролей с RLS.

Ситуация усугубляется тем, что условия разных RLS соединяется через OR, часто сервер СУБД отказывается искать оптимальный план для запроса и назначает наиболее тривиальный, который содержит FULL-сканы по таблицам или индексам и конечно, это может значительно снижать производительность.

 

Ложка меда

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

Ниже пример, когда у пользователя 3 роли с RLS с полностью совпадающим ограничением Read, как видим дублей ограничения нет, но мы понимаем, что роли чаще копируют, чтобы потом их модифицировать и говорил ранее, старую роль не снимают, а новую добавляют.

 

Как найти "задвоенный" RLS в конфигурации

Проблема становиться актуальной, когда:

  • роли, имеющие одинаковые по смыслу ограничения RLS назначены одному пользователю;
  • таблицы имеющие ограничения RLS содержат большое количество записей;
  • к ним часто обращаются.

В платформе 8.3, есть функция:

ПараметрыДоступа(НаименованиеПрава, ОбъектМетаданных, СписокПолей, Роль/пользователь)

она возвращает информацию о наличии права у роли (в нашем случае), а также о наличии ограничений RLS. Подробнее в документации.

Алгоритм анализа:

  1. Выбираем пользователя.
  2. Выбираем все роли установленные у пользователя.
  3. Для каждой роли проверяем права (Read, Insert, Update, Delete) для всех объектов, на которые можно наложить ограничения RLS через роли. Обратите внимание, для регистров и др.объектов используются не виды прав, если не знаете какие, проверяйте через конфигуратор.

На нашей тестовой БД получилась такая таблица:

Все три роли выделены "красным" и имеют ограничение RLS на чтение документа "ПередачаДенег". Не в нашем случае, но в каких-то случаях это может быть оправдано, поэтому всегда нужно перепроверять.

 

Далее, я сформировал на нашей рабочей БД 1С:ЗУП и картина оказалась весьма любопытной, покажу только часть таблицы (префиксы измененных ролей подтерты):

Видим что роль "ИЗМ_ЧтениеКадровойИнформации" по сути дублирует стандартную роль, имеет ограничения RLS типа "Read", а также вероятно имеет некоторые изменения, вполне возможна ситуация задвоения условий в запросе к СУБД, конечно это требует анализа и дальнейших действий по мере необходимости. Также наблюдается проблема с ролью "ЧтениеРабочегоВремени".

Обработка не сложная, работает на управляемых формах, конфигурация любая, разрабатывалась и тестировалась на платформе 8.3.14.1854. Вводится имя пользователя (как текст), которое используется для входа в 1С. Анализируемые объекты: справочники, документы, все виды регистров, бизнес-процессы, задачи, журнал документов.

Обработку выложу ниже, к материалам статьи прилагаю выгрузку тестовой конфигурации. Если скачаете - спасибо за поддержку!

 

Что еще можно посоветовать

Иногда плохо реализованный RLS необязательно является проблемой, если запрос к объекту выполняется раз в час/день и не потребляет много ресурсов, то он не стоит внимания. Надо искать часто выполняемые запросы, а они в купе с "плохим" RLS могут вызывать серьезные проблемы производительности. Определить наиболее затратный по ресурсам запрос Duration/CPU/Disk IO вам поможет Курс по подготовке к экзамену 1С:ЭКСПЕРТ и 1С:Профессионал по технологическим вопросам, его проводят несколько преподавателей, рекомендую попасть к Богачеву Виктору.

 

Другие ссылки:

Типичные ошибки при разработке прав доступа

Консоль запросов RLS

Использование RLS

дубли RLS РЛС дублирование производительность снижение быстродействия тормоз

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159674    876    399    

862

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

16800 руб.

06.12.2023    8884    42    5    

74

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8500 руб.

10.11.2023    10464    36    25    

61

SALE! 20%

Зарплата Роли и права Системный администратор Бухгалтер Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Молдова Россия Казахстан Бухгалтерский учет Платные (руб)

Расширение позволяет максимально полно ограничить доступ пользователей к данным по заработной плате, а именно закрывает доступ к документам начисления и выплаты заработной платы, не позволяет просматривать бухгалтерские отчеты по счету учета зарплаты а также убирает зарплатные проводки из журнала проводок. Расширение запрещает просматривать платежные документы на выплату зарплаты, так же не доступны регламентные отчеты в ПФР и ИФНС. Расширение предлагает готовые настроенные профили "Бухгалтер без зарплаты", "Только просмотр без зарплаты".

5940 4752 руб.

27.05.2021    37612    264    95    

205

Роли и права Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

Данная система разработана как альтернатива стандартной системе напоминаний. Но имеет ряд существенных преимуществ: отображение в базе или с отправкой по почте, свое расписание, возможность фильтрации по ролям и пользователям, формирование своих запросов и макетов, шаблоны писем, работа в фоне. А также может блокировать работу пользователей при заданных условиях. Может работать в составе любой конфигурации. Имеется справка с описанием возможностей. (Обновление от 20.02.2024, версия 2.2, расширение)

19200 руб.

29.11.2019    25661    17    8    

37

Логистика, склад и ТМЦ Роли и права Программист Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Расширение для 1С:Бухгалтерия 3.0, которое позволяет использовать отдельные роли для доступа к складским документам, для доступа к документам раздела "Производство" и для доступа к документам раздела "Покупки".

4560 руб.

21.05.2019    1694787    570    194    

137

Ценообразование, анализ цен Роли и права Системный администратор Платформа 1С v8.3 Управление правами 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Расширение возможностей программы 1С УНФ. Функционал расширения - разграничение всевозможных прав пользователей и контроль при совершении различных действий.

3000 руб.

23.02.2018    58479    160    261    

152
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. acanta 07.10.19 10:54 Сейчас в теме
Спасибо большое.
Правильно ли я понимаю, что РЛС на журналах в управляемых формах не применяется, если в форме не указано РЛС ( обработка, ещё одна форма журнала) или если в ней в динамическом списке написан собственный запрос?
2. geron4 196 07.10.19 14:47 Сейчас в теме
(1) Журнал документов это физическая таблица, на него можно наложить RLS только на чтение (read), если у пользователя есть роль с наложенными ограничениями RLS для Журнала документов, то ограничения будут всегда применяться при любом запросе к объекту метаданных, т.к. это добавляется платформой к запросу к СУБД. На счет указания в форме RLS - не в курсе.
3. YurySigolaev 08.10.19 08:48 Сейчас в теме
(1) RLS в журналах (списках) к динамическому списку применяется .
Точно также как и к любому другому запросу.

А формы вообще к RLS отношения не имеют.
geron4; acanta; +2 Ответить
4. k.dm.v@mail.ru 11.10.19 16:37 Сейчас в теме
Полезная статья! Спасибо!
Оставьте свое сообщение