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

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


1520

Глава 23

Итак, имеются три пользователя, у каждого из которых собственная пара таблиц EMP/DEPT. Данные же в этих таблицах существенно отличаются. У пользователя SCOTT - обычный набор данных ЕМР, у пользователя TKYTE данных в два раза больше, а у пользователя APPLICATION эти таблицы пусты. Теперь создадим приложение:

application@TKYTE816> create or replace procedure emp dept rpt

2 AUTHID GURRENT USER

3 as

4 begin

5 dbmsoutput.putline(Зарплаты и количество сотрудников по -> отделам) ;

6 dbmsoutput.putline(chr(9)Отдел Зарплата Количество);

7 dbmsoutput.putline(chr (9) -) ;

8 for x in (select dept.deptno, sum(sal) sal, count(*) cnt

9 from emp, dept

10 where dept.deptno = emp.deptno

11 group by dept.deptno)

12 loop

13 dbms output.put line(chr(9)

14 to char(x.deptno,99999)

15 to char(x.sal,99,999)

16 to char(x.cnt,99,999));

17 end loop;

18 dbms output.put line(==================) ;

19 end;

20 /

Procedure created.

application@TKYTE816> grant execute on emp dept rpt to public 2 /

Grant succeeded.

application@TKYTE816> set serveroutput on format wrapped application@TKYTE816> exec emp dept rpt; Зарплаты и количество сотрудников по отделам Отдел Зарплата Количество

PL/SQL procedure successfully completed.

Когда процедуру выполняет пользователь APPLICATION таблицы пусты, как и ожидалось. При выполнении же этого приложения пользователями SCOTT и TKYTE:

tkyte@TKYTE816> connect scott/tiger

scott@TKYTE816> set serveroutput on format wrapped scott@TKYTE816> exec application.ernp dept rpt Зарплаты и количество сотрудников по отделам Отдел Зарплата Количество

8,750

10,875

9,400



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

1521

PL/SQL procedure successfully completed.

scott@TKYTE816> connect tkyte/tkyte tkyte@TKYTE816> set serveroutput on format wrapped

tkyte@TKYTE816> exec application.emp dept rpt Зарплаты и количество сотрудников по отделам Отдел Зарплата Количество

10 17,500 6

20 21,750 10

30 18,800 12

PL/SQL procedure successfully completed.

Как видите, процедура действительно обращается к разным таблицам в разных схемах. Тем не менее, как будет показано в разделе Проблемы , надо позаботиться о синхронизации этих схем. Не только должны существовать таблицы с соответствующими именами, но типы данных, порядок и количество столбцов в них при использовании статического SQL тоже должны совпадать.

Когда использовать права создателя

Работа с правами создателя продолжает оставаться доминирующим методом использования скомпилированных хранимых объектов. Для этого имеются две основные при-чин1.

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

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

Производительность и масштабируемость

Процедура, работающая с правами создателя, - замечательная вещь с точки зрения защиты и производительности. В разделе Как работают процедуры с правами вызывающего будет показано, что, благодаря статическому связыванию на этапе компиляции, можно существенно повысить эффективность во время выполнения. Все проверки защиты, зависимостей и т.п. выполняются один раз, при компиляции. Для процедуры, работающей с правами вызывающего, большая часть этих действий будет делаться во время выполнения. Более того, может потребоваться многократно выполнять эти действия в одном сеансе, после выполнения оператора ALTER SESSION или SET ROLE. Любое изменение среды выполнения приводит к изменению поведения процедуры с правами вызывающего. Процедура же с правами создателя от этих изменений не зависит.

Кроме того, как будет показано далее в разделе Проблемы , процедура, работающая с правами вызывающего, более интенсивно использует разделяемый пул, чем ана-



1522

Глава 23

логичная процедура, работающая с правами создателя. Поскольку среда выполнения для процедуры с правами создателя статична, все выполняемые ею статические SQL-опера-торы могут совместно использоваться в разделяемом пуле. Как было показано в других главах этой книги, необходимо заботиться о правильном использовании разделяемого пула (использовать связываемые переменные, избегать излишних разборов и т.д.). Использование процедур с правами создателя гарантирует максимально эффективное использование разделяемого пула. Процедуры же с правами вызывающего могут приводить к неэффективному использованию разделяемого пула. Вместо того чтобы один запрос, SELECT * FROM T, при использовании в процедуре означал бы одно и то же для всех пользователей, он может иметь для пользователей разный смысл. В разделяемом пуле будет больше различных SQL-операторов. Использование прав создателя обеспечивает более эффективное использование разделяемого пула.

Защита

Используя права создателя, можно создать процедуру, безопасно и корректно обрабатывающую определенный набор объектов базы данных. Затем можно предоставить другим пользователям возможность выполнять эту процедуру с помощью оператора GRANT EXECUTE ON <процедура> ТО <пользователь>/риЫ1с/<роль>. Эти пользователи смогут запускать процедуру для чтения/записи таблиц (способом, предусмотренным в коде этой процедуры), но никаким другим способом читать или записывать данные в наши таблицы они не могут. Другими словами, мы только что создали надежн1й процесс изменения или чтения объектов безопасным образом и теперь можем предоставлять пользователям право на это, не опасаясь, что они смогут каким-либо другим способом прочитать или изменить эти объекты. Они не смогут вставлять записи в таблицу сотрудников с помощью утилиты SQL*Plus. Это можно будет делать только с помощью хранимой процедуры, реализующей все необходимые проверки. Этот способ работы существенно влияет на разработку приложения и предоставление прав на использование ваших данных. Больше не придется выполнять операторы GRANT INSERT таблицы, как это делалось для клиент-серверного приложения, непосредственно в1пол-няющего SQL-операторы INSERT. Вместо этого придется выполнить оператор GRA EXECUTE для процедуры, которая может проверять и оценивать данные и их защищенность. Беспокоиться о целостности данных при этом тоже больше не нужно (процедура точно задает, что и как необходимо делать, а других способов работы с данными просто нет).

Сравните это с работой типичных клиент-серверных и даже многих З-уровневых приложений. В клиент-серверном приложении операторы INSERT, UPDATE, DELETE и т.п. включены непосредственно в код клиентского приложения. Для работы этого приложения, пользователю необходимо предоставить привилегии INSERT, UPDATE и DELETE непосредственно для базовых таблиц. Теперь весь мир имеет доступ к базовым таблицам через любой интерфейс, способный взаимодействовать с СУБД Oracle. При использовании процедуры с правами создателя такой проблемы нет. Единственн1й способ изменения таблиц - с помощью надежной процедуры, которой вполне можно доверять. Это очень важное свойство.



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

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