DeepEdit!

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

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

Разрешение ссылок с правами вызывающего


В подпрограмме с права­ми вызывающего внешние ссылки в SQL-операторах разрешаются с помо­щью набора привилегий пользователя, вызывающего эту подпрограмму. Однако ссылки в операторах PL/SQL (например, в операциях присваива­ния и в вызовах процедур) по-прежнему разрешаются на основании набо­ра привилегий владельца. Именно поэтому необходимо предоставлять привилегии (GRANT) только на RecordFullClasses и на таблицу classes
(см. рис. 10.18). Поскольку вызов AlmostFull является ссылкой PL/SQL, он всегда будет выполняться на основании набора привилегий пользова­теля UserA, и поэтому предоставлять привилегии пользователю UserB не нужно.


Теперь предположим, что привилегия на classes не предоставлена. В этом случае UserA может успешно скомпилировать процедуру, поскольку все SQL-объекты доступны набору привилегий UserA. Но пользователь UserB при вызове RecordFullClasses получит сообщение об ошибке ORA-942 (см. рис. 10.19):
Внимание
Выдается сообщение об ошибке ORA-942, а не PLS-201. Это ошибка компиляции базы данных, но получаем мы ее на этапе выполнения.

Роли и права вызывающего Предположим, что привилегия на classes предоставлена не напрямую, а через роль. Напомним, что все привиле­гии на процедуры с правами определяющего нужно предоставлять явным образом (см. рис. 10.17). Для процедур же с правами вызывающего это не так. Внешние ссылки в таких подпрограммах обрабатываются на этапе выполнения, поэтому применяется текущий набор привилегий. Это зна­чит, что привилегии вызывающего, предоставленные через роль, будут доступны (см. рис. 10.20).
Внимание
Привилегии на ссылки, разрешаемые во время компиляции процедуры, по-прежнему необходимо предоставлять напрямую. С помощью роли можно предоставлять привилегии только на те ссылки, которые разрешаются на этапе выполнения программы. При этом подразумевается, что для ссылок этапа выполнения можно использовать команду SET ROLE(при исполнении программ посредством динамического SQL).
Триггеры, представления и права вызывающего Триггеры базы дан­ных всегда исполняются с правами определяющего и на основании набора
привилегий схемы-владельца той таблицы, для которой активизируется
триггер. Это правило действует и для функций PL/SQL, вызываемых из представлений. В этом случае функция исполняется на основании набора привилегий владельца представления.

Использование хранимых функций в SQL-операторах
Вызовы подпрограмм по сути своей реализуются в виде процедур, поэто­му их нельзя выполнять в SQL-операторах. Однако если автономная или модульная функция отвечает определенным условиям, ее можно вызы­вать во время выполнения SQL-оператора. Эта возможность стала впер­вые доступна в PL/SQL версии 2.1 (Огас1е7 редакции 7.1), а в Огас1е8г она была расширена.
Функция, созданная пользователем, вызывается точно так же, как и встроенные функции (например, TO_CHAR, UPPER или ADD_MONTHS). В зависимости от версии Oracle и от области применения функции она должна отвечать определенным условиям. Эти условия определяются так называемыми уровнями строгости.

 









jAntivirus