0

我目前正在 apex.oracle.com 上制作一个应用程序,我已经尝试解决这个问题几个小时了,但我不知道该怎么做。

好的,所以基本上我的应用程序具有基于我在应用程序内部创建的用户表的自定义身份验证。APEX_UTIL因此,检索当前用户的信息似乎使大多数功能变得无用。问题是,我正在尝试找到一种方法将用户的数字 ID 从我的表中存储在会话中,因此我可以直接在整个应用程序的查询中检索它,以便执行类似WHERE id = :MEMBER_ID而不是WHERE UPPER(username) = UPPER(:APP_USER).

现在,我尝试这样做的方法是创建一个 Post Authentication 过程,该过程根据用户名检索用户 ID,并使用APEX_UTIL.SET_SESSION_STATE( p_name => 'MEMBER_ID', p_value => member_id ). 但是,似乎SET_SESSION_STATE无法创建自定义会话值或其他东西,ERR-1002每次我使用文档中未特别提及的值名称时都会返回一个。

我是 APEX 的新手,所以我可能不知道某些事情,但是我进行了很多搜索,但找不到与我的问题特别相关的任何内容。

如果您能提供帮助,非常感谢。

4

2 回答 2

2

您正在尝试将值存储到项目中,无论是页面还是应用程序级别。这要求具有该名称的项目存在于这些范围之一中。那么,您在某处有一个名为 的项目MEMBER_ID吗?
我建议您在应用程序范围内创建一个。浏览共享组件 > 应用程序项。创建后,您应该能够通过apex_util.set_session_state或使用绑定变量语法来赋值,例如:MEMBER_ID := somevariable;

于 2013-05-19T20:19:52.847 回答
2

有多种方法可以做到这一点。在其他答案中已经提出了一些建议。

  1. 申请项目(根据汤姆的回答)

  2. PL/SQL 包全局(根据 hol 的回答) - 尽管您必须为每次调用重置它(例如,通过将代码添加到应用程序的安全属性初始化 PL/SQL 代码并通过将代码添加到Cleanup PL/SQL代码来清除它)。

  3. 全局可访问的上下文- 这种方法虽然有点复杂,但有一些好处,特别是在安全和调试方面。我在这里描述了它:http: //jeffkemponoracle.com/2013/02/28/apex-and-application-contexts/,但基本上:

    1. 创建一个全局可访问的上下文:

      CREATE OR REPLACE CONTEXT MY_CONTEXT USING MY_PACKAGE ACCESSED GLOBALLY;
      
    2. 在身份验证后过程中(在数据库包中MY_PACKAGE),您可以存储您希望跟踪的数据,例如

      DBMS_SESSION.set_context
        (namespace => 'MY_CONTEXT'
        ,attribute => 'MEMBER_ID'
        ,value     => '12345whatever'
        ,client_id =>  v('APP_USER') || ':' || v('APP_SESSION'));
      

      (请注意我的博客文章中的警告以及其他人随后关于 CLIENT_IDENTIFIER 在授权后阶段未可靠设置的评论)

    3. 在您的视图、代码等中,您可以通过简单地引用来访问 MEMBER_ID SYS_CONTEXT('MY_CONTEXT','MEMBER_ID')

于 2013-05-20T07:10:26.017 回答