Oracle 11g-通过user_id跨池连接共享Sys_Context值

时间:2018-11-05 18:46:19

标签: database spring oracle plsql

任何人都可以使用

提供足够好的共享Sys_Context示例

Dbms_Session.Set_Identifier(user_id)

我希望用户成功登录后能够从其他连接访问某些sys上下文属性。


我的情况

Spring Boot 2.0.6使用 HikariCP连接池

连接到Oralce 11g

程序

  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,因为资源正在通过其他连接访问db,因此在 CURRENT 上下文中没有user_id。


此Oracle文档声称有可能:https://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm#DBSEG79745

根据以下这些指南: https://oracle-base.com/articles/misc/dbms_session https://web.stanford.edu/dept/itss/docs/oracle/10gR2/network.102/b14266/apdvcntx.htm

如果无法实现,请告诉我们Dbms_Session.Set_Identifier(user_id)的确切用途,因为我发现这些文档比较晦涩,无法复制它们显示的任何示例。

1 个答案:

答案 0 :(得分:2)

  1. 必须使用GLOBALLY ACCESSIBLE选项创建上下文,例如

    create context ENV using scott.security_pkg accessed globally;
    
  2. 例如,以会话ID(在dbms_session.set_context之内)调用
  3. scott.security_pkg

    dbms_session.set_context(
      namespace => 'ENV',
      attribute => 'user_id',
      value     => 'jane',
      client_id => '12345');
    
  4. 在每个会话中,例如,必须使用用户的会话ID调用
  5. dbms_session.set_identifier

    dbms_session.set_identifier(client_id=>'12345');
    
  6. 现在,您可以使用sys_context来获取属性的值,例如

    sys_context('ENV','user_id')
    

这只是一个使用user_id作为要存储的属性名称的示例。重要的是client_id,它唯一地标识用户的会话。