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

1 ... 369 370 371 [ 372 ] 373 374 375 ... 469


1538

Глава 23

3 AUTHID GURRENT USER

4 as

5 type rc is ref cursor; 6

7 l rec dba users TEMPLATE%rowtype;

8 l cursor rc;

9 begin

10 open l cursor for

11 select *

12 from dba users

13 where username = :x

14 USING upper(p username);

16 fetch l cursor into l rec;

17 if (l cursor%found) then 18

19 dbms output.put line(create user p username);

20 if (l rec.password = EXTERNAL) then

21 dbms output.put line( identified externally);

22 else

23 dbms output.put line

24 ( identified by values l rec.password );

25 end if;

26 dbms output.put line

27 ( temporary tablespace l rec.temporary tablespace

28 default tablespace l rec.default tablespace

29 profile l rec.profile);

30 else

31 dbms output.put line( *** Нет такого пользователя: -> p username );

32 end if;

33 close l cursor;

34 end;

35 /

Procedure created.

tkyte@TKYTE816> exec show user info(USER) ;

create user TKYTE

identified by values 698FlE51F530GA57

temporary tablespace TEMP default tablespace DATA profile DEFAULT PL/SQL procedure successfully completed.

Итак, в данном случае мы использовали таблицу DBA USERS TEMPLATE только для того, чтобы упростить создание типа записи, в которую будут выбираться данные. Можно было бы получить описание представления DBA USERS и создать тип записи со всеми соответствующими полями, но мне больше нравится, когда работу за меня делает сервер. После перехода на новую версию Oracle достаточно будет просто пересоздать таблицу-шаблон и процедура перекомпилируется автоматически, при этом все новые/дополнительные столбцы или изменения типов данных будут автоматически учтены.



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

Проблемы

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

Права вызывающего и использование разделяемого пула

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

Это не хорошо и не плохо. Это просто надо учитывать при задании размера разделяемого пула. При использовании процедур с правами вызывающего мы будем использовать разделяемый пул аналогично тому, как это делает клиент-серверное приложение, использующее интерфейс ODBC или JDBC и непосредственно посылающее серверу операторы ЯМД. Каждый пользователь будет выполнять запрос с одним и тем же текстом, но запросы эти могут различаться. Так что, хотя все выполняют SELECT * FROM T, но поскольку таблицы T у всех пользователей разные, для каждого пользователя будет создаваться и помещаться в разделяемый пул отдельный план запроса и другая соответствующая информация. Это необходимо, поскольку каждый раз используется другая таблица T, с другими правами и планами доступа.

Влияние на разделяемый пул легко продемонстрировать на примере. Я создал в одной схеме следующие объекты:

tkyte@TKYTE816>create table t (x int) ;

Table created.

tkyte@TKYTE816>create table t2 (x int) ; Table created.

tkyte@TKYTE816>create public synonym T for T; Synonym created.

tkyte@TKYTE816> create or replace procedure dr proc

2 as

3 l cnt number;

4 begin

5 select count(*) into l cnt from t DEMO DR;

6 end;

Procedure created.



1540

Глава 23

tkyte@TKYTE816> create or replace procedure ir procl

2 authid current user

3 as

4 l cnt number;

5 begin

6 select count(*) into l cnt from t DEMO IR 1;

7 end;

Procedure created.

tkyte@TKYTE816> create or replace procedure ir proc2

2 authid current user

3 as

4 l cnt number;

5 begin

6 select count(*) into l cnt from tkyte.t DEMO IR 2;

7 end;

Procedure created.

tkyte@TKYTE816> create or replace procedure ir proc3

2 authid current user

3 as

4 l cnt number;

5 begin

6 select count(*) into l cnt from t2 DEMO IR 3;

7 end;

Procedure created.

tkyte@TKYTE816> grant select on t to public;

Grant succeeded.

tkyte@TKYTE816> grant execute on dr proc to public; Grant succeeded.

tkyte@TKYTE816> grant execute on ir procl to public; Grant succeeded.

tkyte@TKYTE816> grant execute on ir proc2 to public; Grant succeeded.

tkyte@TKYTE816> grant execute on ir proc3 to public; Grant succeeded.

Мы создали две таблицы, T и T2. Существует также общедоступный синоним Т для таблицы TKYTE.T. Все четыре процедуры обращаются либо к таблице T, либо к таблице T2. Для процедуры с правами создателя, статически связываемой при компиляции, уточнять имя таблицы именем схемы не надо. Процедура с правами вызывающего, IR PROC1, будет обращаться к таблице T через общедоступный синоним. Вторая процедура, IR PROC2, будет использовать полностью уточненную ссылку, а третья процедура, IR PROC3, будет обращаться к T2 без уточнения схемы. Обратите внимание,



1 ... 369 370 371 [ 372 ] 373 374 375 ... 469

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