ORA-24247: доступ запрещен ACL из функции PL / SQL, но НЕ из SQL - PullRequest
2 голосов
/ 27 мая 2019

Я успешно настроил ACL для моего пользователя и URL.Я подтверждаю это, запустив:

select utl_http.request(*my URL*) 
from   dual;

, который возвращает соответствующий код HTML.

Однако, когда я помещаю этот код в функцию PL/SQL, как показано ниже:

create or replace function temp_func (p_url varchar2)
return varchar2 is
    v_output varchar2(1000);
begin
    select  utl_http.request(p_url)
    into    v_output
    from    dual;

    return v_output;
end;

и запустить этот код из анонимного PL/SQL блока:

declare
    v_result varchar2(1000);
begin
    v_result := temp_func(*my URL*);
    dbms_output.put_line(v_result);
end;

Я получаю следующий стек ошибок:

Error report -
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1722
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at line 1
ORA-06512: at "SIEF.TEMP_FUNC", line 7
ORA-06512: at line 4
29273. 00000 -  "HTTP request failed"
*Cause:    The UTL_HTTP package failed to execute the HTTP request.
*Action:   Use get_detailed_sqlerrm to check the detailed error message.
           Fix the error and retry the HTTP request.

Есть ли способчтобы это исправить?

Я читал https://support.oracle.com/knowledge/Oracle%20Database%20Products/1074843_1.html, и самое близкое, что я нахожу, это: '4.Предоставление ACL через роли не работает, когда служба запрашивается через процедуру PLSQL ', однако я не использовал роли при настройке ACL.

Спасибо!

Моя версия базы данных:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
"CORE   11.2.0.3.0  Production"
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

Моя настройка ACL:

-- Creating ACL
begin
    dbms_network_acl_admin.create_acl(
        acl         => 'WS_test_acl.xml',
        description => 'ACL file for testing purposes.',
        principal   => *my user*,
        is_grant    => TRUE,
        privilege   => 'connect');
end;
-- Adding URL to ACL
begin
    dbms_network_acl_admin.assign_acl(
        acl         => 'WS_test_acl.xml',
        host        => *my URL*);
end;

1 Ответ

0 голосов
/ 28 мая 2019

Когда вещи работают в анонимных блоках, но не в хранимых процедурах, это обычно из-за прав определителя по сравнению с правами вызывающего.Анонимные блоки и процедуры защиты прав вызывающего могут использовать привилегии, предоставляемые ролями, но процедуры определения прав не могут.

Попробуйте изменить return varchar2 is на return varchar2 authid current_user is.

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