ORA-24247: Доступ запрещен ACL из функции PL/SQL, но НЕ из SQL

Я успешно настроил 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;

Итак, как вы настроили ACL? Было бы полезно включить в вопрос все соответствующие утверждения, которые вы выполнили.

Alex Poole 27.05.2019 19:52

Спасибо за уделенное время! Предложение Джона Хеллера решило мою проблему, но я включу свою настройку ACL в вопрос для протокола.

João Lovegrove 28.05.2019 12:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
909
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Оно работает! Спасибо за уделенное время. Я ценю предложение, а также объяснение - я не знал о правах определяющего и вызывающего.

João Lovegrove 28.05.2019 12:10

Другие вопросы по теме