DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Отладка RLS

RLS - это сложная технология, взаимодействующая с разнообразными элементами архитектуры Oracle. Некорректное проектирование или неправильное применение пользователями может привести к возникновению ошибок. К счастью, для большей части ошибок RLS формирует подробный файл трассировки (в каталоге, определенном параметром инициализации базы данных USER_DUMP_DEST). В этом разделе мы поговорим о том, как отслеживать операции RLS и разрешать ошибочные ситуации.
Интерпретация ошибок
Чаще других вам будет встречаться ошибка ORA-28110: «Policy function or package has error» (ошибка функции политики или пакета), с которой легко справиться. Проблема в том, что при компиляции функции политики возникла одна или несколько ошибок. Исправив ошибки компиляции и заново скомпилировав функцию (или пакет, содержащий данную функцию), вы решите проблему.
Переход к типам политик, доступным в Oracle 10g
При переходе с Oracle9i на Oracle 10^ я рекомендую действовать следующим образом:
Сначала использовать тип по умолчанию (динамический).
По завершении обновления попытаться пересоздать политику как контекстно-зависимую и тщательно проверить результаты для всех возможных сценариев, чтобы избежать возможных проблем, которые может повлечь кэширование.
Наконец, преобразовать в статические те политики, для которых это возможно, и так же тщательно проверить результаты.
Могут также возникнуть ошибки во время выполнения, такие как необработанное исключение, несоответствие типов данных или ситуации, когда объем выбранных данных значительно превышает размер переменной, в которую они выбираются. В этих случаях Oracle порождает ошибку ORA-28112: невозможно выполнить функцию политики, и генерирует файл трассировки. Определить причину ошибки можно, проанализировав файл трассировки, хранящийся в каталоге, заданном в параметре инициализации USER_DUMP_DEST. Рассмотрим фрагмент файла трассировки:

Видно, что ошибка возникла, когда пользователь Martin выполнял запрос. Функция политики выбрала более одной строки. Исследовав функцию политики, обнаруживаем такой фрагмент:

Похоже, что существует несколько сотрудников с именем Martin, поэтому и было извлечено несколько строк, что привело к возникновению проблемы. Решение состоит в обработке ошибки через исключение или использовании другого предиката для получения номера отдела.
Мы видим, что функция политики возвращает следующий предикат:
SQL-запрос получается синтаксически некорректным, поэтому политика не работает и запрос пользователя Martin не выполняется. Следу-
Еще одна ошибка, ORA-28113: ошибка в предикате политики, возникает, когда функция политики некорректно строит предложение предиката. Как и в предыдущем случае, формируется файл трассировки. Рассмотрим такой фрагмент: исправить логику функции политики так, чтобы возвращаемый предикат был корректной строкой.

Операции в прямом режиме

Если вы используете операции в прямом режиме (direct-path operations), например прямую загрузку в SQL*Loader, прямую вставку (Direct Path Insert) с использованием подсказки APPEND (INSERT /*+ APPEND */ INTO ...) или прямой экспорт, то при использовании средств RLS могут возникнуть проблемы. Эти операции минуют уровень SQL, поэтому политика RLS для таких таблиц не вызывается, и требования безопасности не проверяются. Как решить эту проблему?
С экспортом все просто. Вот что произойдет при прямом экспорте таблицы EMP (DIRECT=Y), которая защищена одной или несколькими политиками RLS.

Экспорт проведен успешно, но как видите, использован не прямой путь, как нам хотелось, а обычный (conventional path). При выполнении операции экспорта политики RLS применяются к таблице: пользователь может экспортировать не все строки, а только те, доступ к которым ему разрешен.
 Успешно выполненный экспорт для таблицы, защищенной по RLS, может вызвать ложное впечатление о произведен в экспорте всех строк. Не забывайте о том, что экспортируются только те строки, выборка которых разрешена пользователю.
Попытавшись выполнить прямую загрузку в таблицу, защищенную политикой RLS (используя SQL*Loader или Direct Path Insert), получим ошибку.

Сообщение об ошибке говорит само за себя: ошибка в предикате. Решить проблему можно, временно отменив политику для таблицы EMP или осуществив экспорт от имени пользователя, обладающего системной привилегией EXEMPT ACCESS POLICY.
 









jAntivirus