非 sysdba 可以编译 dbms_session 吗?
Can a non sysdba compile dbms_session?
我正在尝试在我的一个存储过程中使用 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 用户(但它有执行权限)执行此代码时,出现权限不足的错误。
提前致谢。
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>
对;现在它按预期工作了。
我正在尝试在我的一个存储过程中使用 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 用户(但它有执行权限)执行此代码时,出现权限不足的错误。
提前致谢。
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>
对;现在它按预期工作了。