Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 dbms_session, привелегии  [new]
use-se
Member

Откуда: Москва
Сообщений: 449
Проблема в следующем. Не дает выполнить dbms_session.set_context, нет привелегий. Смотрим RTFM:
автор
This package runs with the privileges of the calling user, rather than the package owner SYS.
Ладно идем по ссылке на ошибку (строка 78), открываем сам пакет, а он /*wraped*/.
Подскажите пожалуйста какие привелегии необходимы....(поделитесь рыбой)
Если кто знает методу, как вообще вычислять наличие нужных привелегий в подобных ситуациях........ (поделитесь удочкой).
Там же в пакете много всего интересного........... set role, например.
Oracle version: 9.2.0.4
Спасибо.
24 сен 04, 07:53    [984105]     Ответить | Цитировать Сообщить модератору
 Re: dbms_session, привелегии  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18549
тот же автор
This procedure must be invoked directly or indirectly by the trusted package
24 сен 04, 08:01    [984113]     Ответить | Цитировать Сообщить модератору
 Re: dbms_session, привелегии  [new]
use-se
Member

Откуда: Москва
Сообщений: 449
Спасибо. Не обратил внимания на фразу. Я вызов обернул в авнономную процедуру. Выходит по разному механизм Оракла работает с пакетными и автономными процедурами.
24 сен 04, 08:14    [984124]     Ответить | Цитировать Сообщить модератору
 Re: dbms_session, привелегии  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18549
Есть такое понятие - доверенный пакет
Только он один может изменять состояние контекста
tst> connect system/manager@tst
Connected.
tst> grant create any context to u1;

Grant succeeded.

tst> connect u1/u1@tst
Connected.
tst> create package pkg1 as
  2  procedure assign(name varchar2, value varchar2);
  3  end;
  4  /

Package created.

tst> create package body pkg1 as
  2  procedure assign(name varchar2, value varchar2) is
  3  begin
  4  dbms_session.set_context('CTX', name, value);
  5  end;
  6  end;
  7  /

Package body created.

tst> create package pkg2 as
  2  procedure assign(name varchar2, value varchar2);
  3  end;
  4  /

Package created.

tst> create package body pkg2 as
  2  procedure assign(name varchar2, value varchar2) is
  3  begin
  4  dbms_session.set_context('CTX', name, value);
  5  end;
  6  end;
  7  /

Package body created.

tst> create context ctx using pkg2; -- Доверенный пакет pkg2

Context created.

tst> exec pkg2.assign('2', '22');

PL/SQL procedure successfully completed.

tst> exec pkg1.assign('1', '11');
BEGIN pkg1.assign('1', '11'); END;

*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "SYS.DBMS_SESSION", line 78
ORA-06512: at "U1.PKG1", line 4
ORA-06512: at line 1


tst> select namespace, attribute, substr(value, 1, 10) from session_context;

NAMESPACE                      ATTRIBUTE                      SUBSTR(VAL
------------------------------ ------------------------------ ----------
CTX                            2                              22
24 сен 04, 08:17    [984127]     Ответить | Цитировать Сообщить модератору
 Re: dbms_session, привелегии  [new]
use-se
Member

Откуда: Москва
Сообщений: 449
Спасибо за детальный пример. Нашел в своих мозгах еще одну проблему/ошибку. Я почему то полагал, что в спецификации пакета обязательно нужно указывать переменную пакета с таким же именем (ниже в коде покажу), из Вашего примера следует, что это не так. Можете объяснить физический смысл размещения переменных контекста в памяти сервера. Например я полагаю, что после инициализации пекета, инициализируется его контекст (в смысле его переменные, константы). Как только мы устанавливаем какую либо переменную через set_context, Оракл дополнительно в области памяти этого пакета размещает еще переменную и доступ к этой переменной по записи осуществляется из этого же пакета (доверенного). По чтению эта переменная становится доступной, глобально, через sys_context(). Я не в чем не заблуждаюсь?
Вот код:
create or replace package o_context
is
	idrep number;
	procedure set_context(var_name varchar2, var_value varchar2);
end;

create or replace package body o_context
is
	procedure set_context(var_name varchar2, var_value varchar2)
	is
	begin
		dbms_session.set_context('ctx',var_name,var_value);
	end;
end;
24 сен 04, 08:46    [984154]     Ответить | Цитировать Сообщить модератору
 Re: dbms_session, привелегии  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18549
context и переменные пакета - две большие разницы, точнее они полностью независимы.

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

Вообще, как я понимаю, CONTEXT был придуман из соображений безопасности (заполнять его в тригере on logon и использовать в предикатах запросов - предверие FGA)

Кроме того "переменные контекста" можно использовать и в SQL, в отличие от переменных пакета (только в PL/SQL), и вызов функции SYS_CONTEXT не считается вызовом функции, а обрабатывается SQL-машиной, что намного эффективней

И размещаются они не в памяти пакета (которую можно всегда освободить - см.выше), а, видимо, в SGA
24 сен 04, 09:08    [984179]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: dbms_session, привелегии  [new]
Aviff
Member

Откуда:
Сообщений: 11
Спасибо, пришлось использовать контекст, а я все не мог понять почему оно не дает его установить)
Вы мне Очень помогли!
30 апр 21, 09:10    [22316673]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить