oracle 12.2.0.1 中的命名空间sys_Session_roles适用于 sql 查询,但不适用于 plsq



这是我在oracle 12.2.0.1中遇到的问题。我们最近从 12.1.0.2 迁移。它在那里工作得很好。select SYS_CONTEXT ('SYS_SESSION_ROLES', 'ROLE_XYZ') from dual作为SQL查询执行时会给出正确的结果,但在PL/SQL块中执行时不会给出正确的结果。

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

以下是在 SQL 中按预期工作的SYS_CONTEXT函数:

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

从触发器调用时,上面的代码将不起作用。 在触发器和从触发器调用的任何对象中始终禁用角色。 若要查找授予用户的角色,必须在触发器内查询类似DBA_ROLE_PRIVS的表。

相关内容

最新更新