【问题标题】:Can a non sysdba compile dbms_session?非 sysdba 可以编译 dbms_session 吗?
【发布时间】:2020-05-26 19:11:37
【问题描述】:

我正在尝试在我的一个存储过程中使用 sys.dbms_session.set_context,但出现以下错误:

ORA-01031: insufficient privileges

我的问题是我不能在我的存储过程中使用它,但是......当我以具有执行权限(和 sysdba 权限)的用户身份连接时,我遇到了同样的错误(权限不足)。代码如下:

PROCEDURE set_my_env (p_attribute IN VARCHAR2,p_value IN VARCHAR2)
  IS
   l_namespace   VARCHAR2 (30) := 'MY_ENV';
   l_attribute   VARCHAR2 (30) := NULL;
   l_value       VARCHAR2 (4000) := NULL;
  BEGIN
   l_attribute := p_attribute;
   l_value := p_value;

    DBMS_OUTPUT.PUT_LINE('NAMESPACE: ' || l_namespace);
    DBMS_OUTPUT.PUT_LINE('Attribute: ' || l_attribute);
    DBMS_OUTPUT.PUT_LINE('value: ' || l_value);

   DBMS_SESSION.set_context (l_namespace, l_attribute, l_value);

   END set_my_env;

当我以非 sysdba 用户身份执行此代码时(但它具有执行权限),我收到权限不足错误。

提前致谢。

【问题讨论】:

    标签: database oracle oracle11g database-administration sysdba


    【解决方案1】:

    DBMS_SESSION 是一个内置包,它随数据库安装一起安装,有效并可以使用。为什么要编译它(尤其是作为一些普通用户连接)?

    不管怎样,回到你的问题:为什么其他用户不能编译它?因为它属于其他人。系统。授予execute 权限意味着您可以使用它,而不是编译它。

    为了能够编译其他人的程序(包等),您需要被授予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 业务的包,并创建使用该包的上下文。这是一个简化的版本,你会使用一些 smarter 的东西:

    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>
    

    对;现在它可以按预期工作了。

    【讨论】:

    • 感谢您的回复,这确实有帮助...我试图将其编译为一种更简单的方法来确定是否可以使用它。有了你刚刚给我的知识,我现在知道我需要执行它来看看我是否可以使用它......所以这有帮助......我已经根据你上面有用的 cmets 更新了我的问题。你知道我如何能够在非 sysdba 用户运行的存储过程中使用 DBMS_SESSION.set_context 吗?
    • 不客气。我刚刚发布了一个示例,展示了如何使其工作。请看一下。
    • 谢谢,我正在看它,一旦我弄清楚了就会更新这个帖子。再次感谢您花时间进行详细回复。
    • 没问题,慢慢来:)
    • 你是....男人!再次感谢您花时间给我详细的解释。通过我所做的所有谷歌搜索,我现在看到我有我需要的信息,但我没有知识将它们拼凑在一起。非常感谢您编写上面的描述性答案,因为我花了不到两个小时才弄清楚(我是这里的 Oracle 新手)。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2011-07-26
    • 2023-03-19
    相关资源
    最近更新 更多