这是我在Oracle 12.2.0.1中面临的问题。我们最近从12.1.0.2迁移了。那里工作正常。当作为sql查询执行时,select SYS_CONTEXT ('SYS_SESSION_ROLES', 'ROLE_XYZ') from dual
将给出正确的结果,但是在pl / sql块内部执行时,则不能给出正确的结果。
这可能是定义者的权利与调用者的权利的问题。 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