Oracle 12.2.0.1中的命名空间sys_Session_roles可在sql查询中使用,但不能在plsql块内使用

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

这是我在Oracle 12.2.0.1中面临的问题。我们最近从12.1.0.2迁移了。那里工作正常。当作为sql查询执行时,select SYS_CONTEXT ('SYS_SESSION_ROLES', 'ROLE_XYZ') from dual将给出正确的结果,但是在pl / sql块内部执行时,则不能给出正确的结果。

oracle namespaces
1个回答
0
投票

这可能是定义者的权利与调用者的权利的问题。 SQL和匿名PL / SQL块始终以调用者的权限运行,这意味着它们与所有当前启用的角色一起运行。默认情况下,PL / SQL对象以定义者的权限运行,这意味着它们仅具有直接授予用户的特权并排除角色。解决方案可能是将您的功能从定义者的权限更改为调用者的权限。

这是SYS_CONTEXT函数在SQL中按预期工作:

select sys_context('SYS_SESSION_ROLES', 'DBA') has_role
from dual;

HAS_ROLE
--------
TRUE

使用AUTHID DEFINER创建的函数,或者根本不使用AUTHID子句创建的函数,将无法识别该角色。

create or replace function has_dba_definers_rights return varchar2 authid definer is
begin
    return SYS_CONTEXT ('SYS_SESSION_ROLES', 'DBA');
end;
/

select has_dba_definers_rights from dual;

HAS_DBA_DEFINERS_RIGHTS
-----------------------
FALSE

通过添加AUTHID CURRENT_USER,该功能现在将识别所有当前启用的角色。

create or replace function has_dba_invokers_rights return varchar2 authid current_user is
begin
    return SYS_CONTEXT ('SYS_SESSION_ROLES', 'DBA');
end;
/

select has_dba_invokers_rights from dual;

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