Пространство имен sys_Session_roles в oracle 12.2.0.1 работает в SQL-запросе, но не внутри блока plsql - PullRequest
1 голос
/ 15 октября 2019

Это проблема, с которой я сталкиваюсь в oracle 12.2.0.1. Мы недавно мигрировали с 12.1.0.2. Там все работало нормально. select SYS_CONTEXT ('SYS_SESSION_ROLES', 'ROLE_XYZ') from dual даст правильные результаты при выполнении в виде sql-запроса, но не при выполнении внутри блока pl / sql, скажем, функции.

1 Ответ

1 голос
/ 15 октября 2019

Это, вероятно, проблема прав по сравнению с правами инициатора. 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

Приведенный выше код будет не работать, когдазвонил из спускового крючка. Роли всегда отключены в триггерах и в любых объектах, вызываемых из триггера. Чтобы найти роли, предоставленные пользователю, внутри триггера вы должны запросить таблицу типа DBA_ROLE_PRIVS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...