|
Программирование >> Oracle
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 без уточнения схемы. Обратите внимание,
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |