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

1 ... 362 363 364 [ 365 ] 366 367 368 ... 469


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

1517

41 42 43 44 45 46 47 48 49 50 51 5 2 53

55 56

57 58

59 60

- upper(p tname) NORMAL)

from user indexes where a.table name and index type -

loop

dbms output.put(rpad(z.index name,31)

z.uniqueness);

for y in

(selectdecode(column position,l,(, )

column name column name

from user ind columns b where b.index name = z.index name order by column position)

loop

dbms output.put(y.column name); end loop;

dbms output.put line(1) II chr(10)); end loop;

end;

Procedure created.

tkyte@TKYTE816> grant execute 2 /

Grant succeeded.

on desc table to public

Эта процедура интенсивно обращается к представлениям USER INDEXES и USER IND COLUMNS. При работе с правами создателя (без конструкции AUTHID CURRENT USER) эта процедура сможет вьдать информацию только для одного пользователя (и всегда - для одного и того же). Однако при использовании прав вызывающего процедура будет выполняться от имени и с привилегиями пользователя, зарегистрировавшегося во время выполнения. Так что, хотя процедура и принадлежит пользователю TK, ее можно выполнять от имени пользователя SCO и получать результат, подобный следующему:

tkyte@TKYTE816>

connect scott/tiger

scott@TKYTE816>

set serveroutput on

format wrapped

scott@TKYTE816>

exec tkyte.desc table(emp)

Типы данных для

таблицы emp

Имя столбца

Тип данных

Длина

Пустые значения

EMPNO

NUMBER

(4,0)

not null

ENAME

VARCHAR2

null

VARCHAR2

null

NUMBER

(4,0)

null

HIREDATE

Date

null

NUMBER

(7,2)

null

COMM

NUMBER

(7,2)

null

DEPTNO

NUMBER

(2,0)

null



1518 Глава 23

Индексы по emp

EMP PK UNIQUE(EMPNO)

PL/SQL procedure successfully completed.

Универсальные объектные типы

Идея в данном случае та же, что и в предыдущем, но результаты могут быть более общезначимыми. С помощью средств Oracle 8, позволяющих создавать собственные объектные типы со специфическими методами обработки данных, можно создавать методы, работающие с набором привилегий текущего зарегистрированного пользователя. То есть, создав универсальные, обобщенные типы, их устанавливают в базе данн1х один раз и разрешают всем использовать. Без возможности работать с правами в]з1вающего владелец объектного типа должен был иметь очень мощные привилегии (как было описано ранее) или надо было устанавливать этот объектный тип в каждой схеме, где его предполагалось использовать.

Именно с правами вызывающего всегда работали объектные типы, стандартно поставляемые в составе сервера Oracle (например, типы ORDSYS.*, используемые для поддержки компонентов interMedia), что позволяло устанавливать их в базе данных только один раз, а использовать - любому пользователю со своими привилегиями. Это имеет значение, потому что объектные типы ORDSYS выполняют чтение и запись в таблицы базы данных. Набор таблиц, к которым они обращаются, полностью зависит от того, кто именно выполняет соответствующие методы. Именно это свойство позволяет обеспечить универсальность и общедоступность этих типов. Они устанавливаются в схеме ORDSYS, но пользователь ORDSYS не имеет доступа к таблицам, с которыми они фактически работают. Теперь, используя Oracle 8i, разработчики приложений могут создавать такие же типы.

Реализация собственных средств контроля доступа

В Oracle 8i появилась возможность тщательного контроля доступа (Fine Grained Access Control - FGAC), благодаря чему можно реализовать правила защиты, предотвращающие несанкционированный доступ к данным. Обычно для этого в каждую таблицу добавляется столбец, например COMPANY. Значения в этом столбце автоматически формируются триггером, а в каждый запрос включается условие WHERE COMPANY = SYS CONTEXT (...), ограничивающее набор доступных пользователю строк только теми, доступ к которым авторизован (подробнее об этом см. в главе 21).

Можно также создавать отдельную схему (набор таблиц) для каждой компании. Другими словами, для каждой компании устанавливается и наполняется данными свой набор таблиц. При этом в принципе невозможен доступ одного пользователя к данн1м другого, поскольку данные эти физически хранятся в другой таблице. Это - вполне уместный подход, имеющий преимущества (и недостатки) по сравнению со средствами тщательного контроля доступа. Проблема, однако, в том, что хотелось бы поддерживать один набор хранимого кода для всех пользователей. Кэширования же в разделяемом пуж



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

десяток копий одного и того же большого PL/SQL-пакета желательно избежать. Не хотелось бы изменять десяток экземпляров одного и того же кода, если в нем будет найдена ошибка. Не хотелось бы, чтобы пользователи выполняли потенциально разные версии одного кода. Работа с правами вызывающего идеально поддерживает эту модель защиты (несколько наборов таблиц и один экземпляр кода).

Имея возможность работать с правами вызывающего, можно написать одну хранимую процедуру, обращающуюся к таблицам с правами доступа текущего пользователя и разрешением имен в его схеме. Как было продемонстрировано в примере с процедурой PRINT TABLE, это можно сделать как с помощью динамического, так и статического SQL Рассмотрим следующий пример. Установим таблицы EMP/DEPT в схеме SCO и в моей схеме TKYTE. Третий пользователь будет создавать приложение, использующее таблицы ЕМР и DEPT для создания отчета; он не будет иметь доступа к таблицам ЕМР и DEPT ни в схеме SCOTT, ни в схеме TKYTE (его таблицы созданы для тестирования). Вы увидите, что процедура, выполненная пользователем SCO, будет выдавать данные из схемы SCOTT; когда же ее выполнит пользователь TKYTE, будут использованы таблицы последнего:

tkyte@TKYTE816> connect scott/tiger scott@TKYTE816> grant select on emp to public; Grant succeeded.

scott@TKYTE816> grant select on dept to public; Grant succeeded.

scott@TKYTE816> connect tkyte/tkyte

tkyte@TKYTE816> create table dept as select * from scott.dept; Table created.

tkyte@TKYTE816> create table emp as select * from scott.emp; Table created.

tkyte@TKYTE816> insert into emp select * from emp; 14 rows created.

tkyte@TKYTE816> create user application identified by pw

2 default tablespace users quota unlimited on users;

User created.

tkyte@TKYTE816> grant create session, create table, 2 create procedure to application;

Grant succeeded.

tkyte@TKYTE816> connect application/pw

application@TKYTE816> create table emp as select * from scott.emp where 1=0; Table created.

application@TKYTE816> create table dept as

2 select * from scott.dept where 1=0;

Table created.



1 ... 362 363 364 [ 365 ] 366 367 368 ... 469

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