Oracle 11g - разделяет значения Sys_Context по соединению пула по user_id - PullRequest
0 голосов
/ 05 ноября 2018

Может ли кто-нибудь предоставить достаточно хороший пример совместного использования Sys_Context в действии, используя

Dbms_Session.Set_Identifier(user_id)

Я хочу получить доступ к некоторому атрибуту контекста sys из другого соединения после успешного входа пользователя.


Мой сценарий :

Spring Boot 2.0.6 Подключение к Oralce 11g с использованием пула соединений HikariCP

Порядок

  1. Пользователь заходит на страницу входа
  2. Вход в систему -> user_id установлен Dbms_Session.Set_Context('ENV', USER_ID, user_id)
  3. Пользователь получает доступ к некоторому ресурсу (например, учетным записям) -> Sys_Context('ENV', user_id) возвращает Null

Sys_Context('ENV', user_id) возвращает значение Null, поскольку ресурс получает доступ к базе данных через другое соединение, следовательно, отсутствует user_id в контексте CURRENT .


В этой документации Oracle утверждается, что это возможно: https://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm#DBSEG79745

Как указано ниже: https://oracle -base.com / Статьи / разное / dbms_session https://web.stanford.edu/dept/itss/docs/oracle/10gR2/network.102/b14266/apdvcntx.htm

Если это невозможно, скажите, для чего конкретно используется Dbms_Session.Set_Identifier(user_id), потому что я нахожу эти документы довольно неясными и не могу воспроизвести любые примеры, которые они показывают.

1 Ответ

0 голосов
/ 06 ноября 2018
  1. Контекст должен быть создан с опцией GLOBALLY ACCESSIBLE, например,

    create context ENV using scott.security_pkg accessed globally;
    
  2. dbms_session.set_context вызывается с идентификатором сеанса (в пределах scott.security_pkg), например,

    dbms_session.set_context(
      namespace => 'ENV',
      attribute => 'user_id',
      value     => 'jane',
      client_id => '12345');
    
  3. dbms_session.set_identifier должен вызываться с идентификатором сеанса пользователя в каждом сеансе, например,

    dbms_session.set_identifier(client_id=>'12345');
    
  4. Теперь вы можете получить значение для атрибута, используя sys_context, например,

    sys_context('ENV','user_id')
    

Это просто пример использования user_id в качестве имени атрибута, который вы хотите сохранить. Важный бит - client_id, который однозначно идентифицирует сеанс пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...