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