DeepEdit!

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

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

Хранимые подпрограммы и роли

Теперь немного изменим ситуацию, показанную на рис. 10.15. Предполо­жим, что UserA не владеет ни temp_table, ни RecordFullClasses, а оба эти объекта принадлежат пользователю UserB. Кроме того, изменим Record­FullClasses так, чтобы эта процедура явно ссылалась на объекты пользо­вателя UserA (см. рис. 10.16).
Для того чтобы процедура RecordFullClasses была корректно скомпи­лирована, пользователь UserA должен предоставить привилегию SELECT на таблицу classes и привилегию EXECUTE на функцию AlmostFull поль­зователю UserB (см. рис. 1.0.16). Более того, предоставить эти привилегии необходимо явно, а не через роль. Ниже приведены операторы GRANT, выполняемые пользователем UserA для обеспечения успешной компиля­ции UserB.RecordFullClasses.
то привилегии предоставлены не будут. Использование роли показано на рис. 10.17.
Итак, уточним правило, сформулированное в предыдущем разделе:
Подпрограмма выполняется на основании привилегий, которые пре­доставлены ее владельцу явно, а не через роль.
Если предоставить привилегии через роль, то при попытке компиля­ции RecordFullClasses будет выдано сообщение об ошибке PLS-2GT:
Это правило распространяется на триггеры и модули, которые хра­нятся в базе данных. Таким образом, в хранимых процедурах, функциях, мо­дулях и триггерах доступны только те объекты, которые принадлежат владельцам этих подпрограмм или пользователям, которым явно предостав­лены привилегии на применение этих подпрограмм.
Почему же установлено такое ограничение? Для ответа на этот вопрос необходимо обратиться к процессу связывания. В PL/SQL используется раннее связывание: ссылки определяются во время компиляции, а не вы­полнения подпрограммы. Операторы GRANT и REVOKE являются операто­рами DDL. Они начинают действовать немедленно, и новые записываются в словарь данных. Во всех соединениях, установленных с базой данных, будет виден новый набор привилегий. Однако это не все­гда справедливо для ролей. Роль можно предоставить пользователю, а этот пользователь затем вправе запретить ее при помощи команды SET ROLE. Отличие заключается в том, что команда SET ROLE действует только в одном сеансе базы данных, в то время как операторы GRANT и REVOKE применяются для всех сеансов. Роль может быть запрещена в одном сеансе, но разрешена в других.
Чтобы использовать в хранимых подпрограммах и триггерах привиле­гии, предоставляемые через роль, эти привилегии нужно проверять вся­кий раз при запуске процедуры. Проверка привилегий является этапом процесса связывания. Но раннее связывание означает, что привилегии проверяются во время компиляции, а не выполнения. Для того чтобы раннее связывание было осуществимо, все роли внутри хранимых процедур, функций, модулей и триггеров запрещаются
 









jAntivirus