DBMS_SESSION
- это встроенный пакет, он установлен вместе с установкой базы данных, действителен и готов к использованию. Зачем вам его компилировать (особенно подключенный как обычный пользователь)?
В любом случае, вернемся к вашему вопросу: почему другие пользователи не могут его скомпилировать? Потому что это принадлежит кому-то другому . SYS. Предоставление привилегии execute
означает, что вы можете использовать it, а не компилировать it.
Чтобы иметь возможность компилировать чужие процедуры (пакеты, что угодно), вам необходимо предоставить системную привилегию alter any procedure
. Однако это не включает объекты, принадлежащие SYS. Чтобы перекомпилировать их, вам необходимо подключить as sysdba
.
Если вы хотите, чтобы он (dbms_session
) работал, вот как: подключиться как SYS
, предоставить необходимые права пользователю (scott
в моем примере):
SQL> show user
USER is "SYS"
SQL> grant create any context, drop any context, alter session, unlimited tablespace to scott;
Grant succeeded.
SQL> grant execute on dbms_session to scott;
Grant succeeded.
SQL>
Теперь подключитесь как scott
; это все равно не сработает:
SQL> connect scott/tiger
Connected.
SQL> exec dbms_session.set_context('my_context', 'my_parameter', 'Littlefoot');
BEGIN dbms_session.set_context('my_context', 'my_parameter', 'Littlefoot'); END;
*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "SYS.DBMS_SESSION", line 101
ORA-06512: at line 1
Что вам нужно сделать, так это создать пакет, который вы будете использовать для своего context бизнеса, и создать контекст, который использует этот пакет. Это упрощенная версия, вы бы использовали что-нибудь умнее :
SQL> create or replace package pkg_context as
2 procedure p_set;
3 end;
4 /
Package created.
SQL> create or replace package body pkg_context as
2 procedure p_set as
3 begin
4 dbms_session.set_context('my_context', 'my_parameter', 'Littlefoot');
5 end;
6 end;
7 /
Package body created.
SQL> create context my_context using pkg_context;
Context created.
SQL>
Теперь мы готовы!
SQL> exec pkg_context.p_set;
PL/SQL procedure successfully completed.
SQL> select sys_context('my_context', 'my_parameter') from dual;
SYS_CONTEXT('MY_CONTEXT','MY_PARAMETER')
--------------------------------------------------------------------------------
Littlefoot
SQL>
Верно; теперь все работает как положено.