Я успешно настроил 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 в вопрос для протокола.
Когда что-то работает в анонимных блоках, но не в хранимых процедурах, это обычно происходит из-за прав определяющего по сравнению с правами вызывающего. Анонимные блоки и процедуры прав вызывающего могут использовать привилегии, предоставленные через роли, но процедуры прав определяющего не могут.
Попробуйте заменить return varchar2 is
на return varchar2 authid current_user is
.
Оно работает! Спасибо за уделенное время. Я ценю предложение, а также объяснение - я не знал о правах определяющего и вызывающего.
Итак, как вы настроили ACL? Было бы полезно включить в вопрос все соответствующие утверждения, которые вы выполнили.