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

1 ... 364 365 366 [ 367 ] 368 369 370 ... 469


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

Часто разработчики спрашивают: Как сделать так, чтобы только мое приложение, myapp.exe, могло выполнять действие X в базе данных? . Например, надо, чтобы это приложение могло выполнять вставку в таблицу, но другие приложения этого сделать не могли. Единственно безопасн1й способ сделать это - поместить алгоритмы работы с дан-н1ми приложения myapp.exe в базу данных, и никаких операторов INSERT, UPDATE, DELETE или SELECT в клиентском приложении. Разместив приложение непосредственно в базе данных, устранив необходимость выполнять вставку (или любые другие операции с таблицей) в клиентском приложении, вы добьетесь того, чтобы только одно приложение могло обращаться к данным. Размещая алгоритмы работы с базой данных приложения в ней самой, мы делаем из приложения просто еще одни уровень абстракции. Не имеет значения, как вызывается приложение (его компонент, работающий с базой данных) - из SQL*Plus, из графического интерфейса или из другого, еще нереализованного интерфейса, - в базе данных работает одно и то же приложение.

Как работают процедуры с правами вызывающего

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

Права создателя

При использовании прав создателя хранимая процедура компилируется с учетом привилегий, непосредственно предоставленных пользователю, владеющему процедурой. Под непосредственно предоставленными привилегиями подразумеваются все объектные и системные привилегии, предоставленные пользователю или роли PUBLIC, но не другим ролям, которые предоставлены пользователю или роли PUBLIC. Короче, для процедур с правами создателя роли не учитываются и не используются, ни во время компиляции, ни при выполнении. Процедура компилируется только с учетом непосред-ственн1х привилегий. Это описано в руководстве OracleApplication Developers Guide тик:.

Привилегии, необходимые для создания процедур и функций

При создании отдельной процедуры или функции, спецификации или тела пакета должны выполняться следующие требования.

Необходимо наличие системной привилегии CREATE PROCEDURE (для создания процедуры или пакета в своей схеме) или системной привилегии CREATE ANY PROCEDURE (для создания процедуры или пакета в другой пользовательской схеме).

Внимание: Для успешной компиляции процедуры или пакета требуются следующие дополнительные привилегии:

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



1524

Глава 23

владелец не может получить необходимые привилегии через роли.

Если привилегии владельца процедуры или пакета изменяются, процедуру необходимо повторно аутентифицировать перед выполнением. Если необходимая для доступа к объекту привилегия у владельца процедуры (или пакета) отобрана, выполнение процедуры становится невозможным.

Хотя это явно и не сказано, предоставление привилегии роли PUBLIC ничуть не хуже, чем непосредственно владельцу процедуры. Необходимость непосредственного предоставления привилегий владельцу процедуры, работающей с правами создателя, иногда приводит к странным ситуациям. Оказывается, можно выполнить запрос к объекту в SQL*Plus и использовать анонимный блок доступа к этому же объекту, но нельзя создать хранимую процедуру для обращения к этому объекту. Зададим необходимые для данного примера привилегии:

scott@TKYTE816> revoke select on emp from public-Revoke succeeded.

scott@TKYTE816> grant select on emp to connect; Grant succeeded.

scott@TKYTE816> connect tkyte/tkyte

tkyte@TKYTE816> grant create procedure to another user; Grant succeeded.

А теперь убедимся, что пользователь ANOTHERUSER может делать запросы к таблице SCOTT.EMP:

tkyte@TKYTE816> connect another user/another user

another user@TKYTE816> select count(*) from scott.emp; GOUNT(*)

Пользователь ANOTHER USER также может выполнять анонимный блок PL/SQL:

another user@TKYTE816> begin

2 for x in (select count(*) cnt from scott.emp)

3 loop

4 dbms output.put line(x.cnt);

5 end loop;

6 end;

PL/SQL procedure successfully completed.

Однако при попытке создать процедуру, идентичную представленному выше PL/SQL-блоку, мы получим следующее:

another user@TKYTE816> create or replace procedure P 2 as



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

3 begin

4 for x in (select count(*) cnt from scott.emp)

5 loop

6 dbms output.put line(x.cnt);

7 end loop;

8 end;

Warning: Procedure created with compilation errors . another user@TKYTE816> show err

Errors for PROCEDURE P:

LINE/COL ERROR

4/14 PL/SQL: SQL Statement ignored

4/39 PLS-00201: identifier SCOTT.EMP must be declared

6/9 PL/SQL: Statement ignored

6/31 PLS-00364: loop index variable X use is invalid

Я не могу создать процедуру (собственно, любой скомпилированный хранимый объект, скажем, представление или триггер), обращающуюся к таблице SCOTT.EMP. Это предсказуемая и описанная в документации особенность. В рассмотренном выше

примере пользователь ANOTHER USER имеет роль CONNECT. Роли CONNECT была

предоставлена привилегия SELECT для таблицы SCOTT.EMP. Эта привилегия роли CONNECT, однако, недоступна в хранимой процедуре с правами создателя, поэтому и в]дается сообщение об ошибке. Чтобы избежать таких странностей, я рекомендую выполнить оператор SET ROLE NONE в среде SQL*Plus и попытаться выполнить оператор, который предполагается включить в хранимую процедуру. Например:

another user@TKYTE816> set role none;

Role set.

another user@TKYTE816> select count(*) from scott.emp;

select count(*) from scott.emp

ERROR at line 1:

ORA-00942: table or view does not exist

Если оператор сработает в SQL*Plus без ролей, он, несомненно, сработает и в хранимой процедуре, выполняющейся с правами создателя.

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

При компиляции процедуры выполняется несколько действий, связанных с привилегиями. Здесь я их вкратце опишу, а затем рассмотрю подробно.

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

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



1 ... 364 365 366 [ 367 ] 368 369 370 ... 469

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