8c7f6c03

Глобальный контекст сеанса («контекст приложения»)


«Обычный» контекст сеанса имеет своею областью действия отдельный сеанс. Иногда этого разработчику приложения вполне достаточно, а иногда хочется большего. Можно ли, например, запретить сеансу самостоятельно выставлять значение атрибута и предоставить ему только чтение, а значение задавать из другого сеанса? Такую возможность обеспечивает глобальный контекст сеанса, называемый еще иногда контекстом приложения. Пример его использования показан ниже:

CONNECT / AS SYSDBA

CREATE OR REPLACE CONTEXT globalcontext USING globalcontext_pckg

ACCESSED GLOBALLY

/

CREATE OR REPLACE PACKAGE globalcontext_pckg AS PROCEDURE set_value ( par VARCHAR2 , val VARCHAR2 , usr VARCHAR2

, usrid VARCHAR2

); END; /

CREATE OR REPLACE PACKAGE BODY globalcontext_pckg AS PROCEDURE set_value ( par VARCHAR2 , val VARCHAR2 , usr VARCHAR2 , usrid VARCHAR2 ) AS BEGIN DBMS_SESSION.SET_CONTEXT ( 'globalcontext' , par , val , usr

, usrid

); END; END; /

EXECUTE globalcontext_pckg.set_value - ( 'sesame' , '123', 'SCOTT', 'XYZ32A6' )

Проверка:

SQL> CONNECT scott/tiger Connected. SQL> SELECT SYS_CONTEXT ( 'globalcontext', 'sesame' ) FROM dual;

SYS_CONTEXT('GLOBALCONTEXT','SESAME') --------------------------------------------------------------------



 

SQL> EXECUTE DBMS_SESSION.SET_IDENTIFIER ( 'XYZ32A6' );

PL/SQL procedure successfully completed.

SQL> SELECT SYS_CONTEXT ( 'globalcontext', 'sesame' ) FROM dual;

SYS_CONTEXT('GLOBALCONTEXT','SESAME') -------------------------------------------------------------------- 123

SQL> EXECUTE DBMS_SESSION.SET_IDENTIFIER ( 'XYZ32A6ZZZ' );

PL/SQL procedure successfully completed.

SQL> SELECT SYS_CONTEXT ( 'globalcontext', 'sesame' ) FROM dual;

SYS_CONTEXT('GLOBALCONTEXT','SESAME') ----------------------------------------------------------------------

 

Тут есть сразу несколько интересных новшеств.

  • То, что контекст глобальный, было указано словами ACCESSED GLOBALLY при его создании.
  • В процедуре DBMS_SESSION.SET_CONTEXT именно для глобального контекста существуют два дополнительных параметра. Первый сообщает, сеансам чьего пользователя будет доступен этот контекст (для каждого такого пользователя нужно будет выполнить отдельный вызов SET_CONTEXT), а второй - условное значение, которое необходимо будет сообщить для возможности прочитать установленное другим сеансом значения атрибута, своего рода пароль.
  • Сообщение этого условного значения выполняется специальной процедурой DBMS_SESSION.SET_IDENTIFIER.
  • Таким образом, мало войти в СУБД под «правильным» пользователем; для того, чтобы получить в сеансе значение желаемого атрибута (глобального контекста), нужно будет еще сообщить условную строку. Излишне напоминать, что очевидным кандидатом на такую строку является cookie сеанса общения с web. И только благодаря этому, а также механизму избирательного доступа к частям таблицы в Oracle («виртуальные частные базы данных», VPD/FGAC) и возможности сервера приложений автоматически выдавать SET_IDENTIFIER при обращении к БД, многочисленные пользователи web, формально подключаемые к СУБД под одними и теми же именами пользователей Oracle, смогут увидеть в базе каждый собственные данные.



    Содержание раздела