非系统管理员可以编译dbms_session吗?

问题描述 投票:0回答:1

我试图在我的一个存储过程中使用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个回答
2
投票

DBMS_SESSION 是一个内置包,它是 安装 和数据库安装一起,是有效的,可以使用的。为什么你要编译它(特别是连接到一些的 普通 用户)?)

总之,回到你的问题:为什么其他用户不能编译?因为它 别人家的. SYS. 授予 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

你要做的是创建一个包,你将用于你的。语境 业务,并创建使用该包的上下文。这是一个简化的版本,你会使用一些类似于 更聪明:

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>

是的,现在它的工作原理和预期一样。

© www.soinside.com 2019 - 2024. All rights reserved.