Проанализируем ситуацию, представленную на рис. 10.15. Здесь оба пользователя UserA и UserB владеют копиями таблицы temp_table, a RecordFullC-lasses принадлежит UserA и вводит данные в UserA. temp_tabie. RecordFullClasses называется процедурой с правами определяющего (definer's rights), поскольку неквалифицированные внешние ссылки внутри нее разрешаются на основании набора привилегий ее владельца, т.е. определяющего.
Возможен и другой способ разрешения внешних ссылок. В подпрограмме с правами вызывающего (invokeг''s rights) внешние ссылки разрешаются на основании набора привилегий не владельца, а вызывающего. Подобная подпрограмма создается с помощью предложения AUTHID. Это разрешено только для автономных подпрограмм, для описаний модулей и для описаний объектных типов (см. главу 12).
Все отдельные подпрограммы модуля должны иметь права вызывающего или определяющего, их комбинация недопустима. Синтаксис AUTHID:
Если в предложении AUTHID указано (текущий пользователь), то объекту предоставляются права вызывающего, а если DEFINER — то права определяющего. По умолчанию (если конструкция AUTHID отсутствует) устанавливаются права определяющего.
Например, следующий вариант процедуры RecordFullClasses обладает правами вызывающего:
Внимание
В invokers.sql сначала создаются пользователи UserA и UserB, а затем объекты, используемые в примерах этого раздела. Чтобы пример выполнялся в вашей системе, возможно, придется изменить пароль учетной записи DBA. Результат выполнения invokers. sql находится в файле invokers.out.,
Если RecordFullClasses выполняется пользователем UserB, данные вводятся в таблицу UserB. temp_table, а если пользователем UserA - то в таблицу UserA. temp_table. Это демонстрируется следующим сеансом SQL*Plus и рис. 10.18.
< Предыдущая | Следующая > |
---|