Программирование >>  Oracle 

1 ... 367 368 369 [ 370 ] 371 372 373 ... 469


1532

Глава 23

tkyte@TKYTE816> connect a/a

a@TKYTE816> create table t (x varchar2(2 55)); Table created.

a@TKYTE816> insert into t values (Табла пользователя A); 1 row created.

Затем пользователь А создает функцию с правами вызывающего, процедуру с правами создателя и представление:

a@TKYTE816> create function Invoker rights function return varchar2

2 AUTHID CURRENT USER

3 as

4 l data varchar2(4000) ;

5 begin

6 dbms output.put line(H - функция с правами вызывающего, -> принадлежащая А) ;

7 8 9

10 11 12 13 14 15 16 17 18

current user) current schema)

select current user=

sys context(userenv, current schema= sys context(userenv, active roles=1 cnt data from T= t.x into l data

from (select count(*) cnt from session roles), return l data;

end;

Function created.

a@TKYTE816> grant execute on Invoker rights function to public-Grant succeeded.

a@TKYTE816> create procedure Definer rights procedure

2 as

3 l data varchar2(4000);

4 begin

5 dbms output.put line(J - процедура с правами создателя, -> принадлежащая А) ;

6 7 8

10 11 12 13 14 15 16

select current user=

sys context(userenv, current user) current schema= sys context(userenv, active roles= cnt data from T= t.x into l data

from (select count(*) cnt from session roles).

current user) current schema)

dbms output.put line(l data); dbms output.put line -> (Теперь вызываем функцию с правами вызывающего...); 17 dbms output.put line(Invoker rights function);



Права вызывающего и создателя 1533

18 end;

19 / Procedure created.

a@TK[E816> grant execute on Definer rights procedure to public-Grant succeeded. a@TKE816> create view V

2 as

3 select invoker rights function from dual

View created.

a@TKYTE816> grant select on v to public

2 /

Grant succeeded.

Зарегистрируемся как пользователь В, создадим таблицу T с идентифицирующей пользователя строкой и выполним созданную ранее функцию:

a@TKYTE816> connect b/b

b@TKYTE816> create table t (x varchar2(255)); Table created.

b@TKYTE816> insert into t values ( Табла пользователя Б); 1 row created.

b@TKYTE816> exec dbms output.put line(a.Invoker rights function) Я - функция с правами вызывающего, принадлежащая А current user=B current scheroa=B active roles=3 data from Т=Таблица -> пользователя В

PL/SQL procedure successfully completed.

Итак, мы видим: когда пользователь В непосредственно вызывает функцию с правами вызывающего, принадлежащую пользователю А, во время ее выполнения используются привилегии пользователя В (current user=B). Далее, поскольку current schema - тоже пользователь В, запрос выбирает данные из таблицы B.T, а не из A.T. Это доказывает строка data from Т=Таблица пользователя В в представленных выше результатах. Наконец, мы видим, что при выполнении запроса в сеансе активны три роли (третья роль - PLUSTRACE, необходимая для использования AUTOTRACE; в моей базе данных она предоставлена роли PUBLIC). Посмотрим, что произойдет при вызове через процедуру с правами создателя:

b@TKYTE816> exec a.Definer rights procedure

Я - процера с правами создателя, принадлежащая А

current user=A current schema=A active roles=0 data from Т=Таблица

-> пользователя А

Теперь вызываем функцию с правами вызывающего.. . Я - функция с правами вызывающего, принадлежащая А current user=A current schema=A active roles=0 data from Т=Та6лица -> пользователя А

PL/SQL procedure successfully completed.



1534

Глава 23

Вы видите, что процедура с правами создателя выполняется с привилегиями пользователя А, кроме ролей (active roles=0). Процедура с правами создателя жестко связана с таблицей A.T и не обращается к таблице B.T.

Важнее всего то, что происходит при вызове функции с правами вызывающего из процедуры с правами создателя. Обратите внимание, что на этот раз в1ваюший -пользователь А, а не В. Вызывающий определяется текущей схемой в момент вызова процедуры с правами вызывающего. Функция больше не выполняется от имени В, как в предыдущем случае, - теперь она выполняется от имени пользователя А. Поскольку current user и current schema теперь задают пользователя А, функция с правами в1-вающего обращается к таблице пользователя А. Еще один важный факт: на этот раз роли в функции с правами вызывающего не действуют. При входе в процедуру с правами создателя роли отключаются и остаются отключенными до выхода из этой процедуры.

Теперь рассмотрим последствия вызова функции с правами вызывающего из SQL-оператора:

b@TKYTE816> select a.invoker rights function from dual; INVOKER RIGHTS FUNGTION

current user=B current schema=B active roles = 3 data from Т=Таблица -> пользователя В

b@TKYTE816> select * froma.v;

INVOKER RIGHTS FUNGTION

current user=A current schema=A active roles=0 data from Т=Таблица -> пользователя А

Как видите, вызов процедуры с правами вызывающего непосредственно из SQL-оператора (как в нашем случае, когда мы выбирали значение функции из таблицы DUa), ничем не отличается от непосредственного вызова. Более того, вызов функции из представления, как во втором запросе, показывает, что она ведет себя так же, как при вызове из процедуры с правами создателя, поскольку представления всегда сохраняются с правами создателя.

Компиляция процедуры с правами вызывающего

А сейчас разберемся, что происходит при компиляции и сохранении в базе данн1х процедуры с правами вызывающего. Может показаться странным, но происходит в точности то же, что и при компиляции процедуры с правами создателя. Выполняются следующие шаги:

Проверяется существование всех объектов, к которым процедура обращается статически (всех, к которым она не обращается с помощью динамического SQL). Имена разрешаются с помощью стандартных правил области действия по отношению к владельцу процедуры. Роли не учитываются.

Проверяется, все ли объекты доступны в нужном режиме. Например, если в1-полняется оператор UPDATE T, сервер Oracle проверит, может ли создатель или роль PUBLIC выполнять UPDATE T непосредственно, не используя ролей.



1 ... 367 368 369 [ 370 ] 371 372 373 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика