UTL_HTTP 에러

2022. 6. 21. 23:19Oracle/Oracle Error

반응형

1. UTL_HTTP 사용하는 프로시저를 컴파일을 하였지만 다음과 같은 에러가 발생하였다.

ORA-06550: line 3, column 6:
PLS-00201: identifier 'SYS.UTL_HTTP' must be declared
ORA-06550: line 3, column 6:

 

2. 원인을 찾던 중 utl_http 가 정의(?)가 되지 않았음을 알 수 있었다. 알 수 있었던 방법은 단순하였다.

https://community.oracle.com/tech/developers/discussion/469405/problem-calling-utl-http-in-oracle-xe

$ sqlplus "/as sysdba"

SQL> desc utl_http

utl_http의 정보들이 출력이 될 것이다.

SQL> conn system/123456

SQL> desc utl_http

ERROR:
ORA-04043: object "SYS"."UTL_HTTP" does not exist

SQL> select * from dba_tab_privs where table_name = 'UTL_HTTP';

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
SCOTT SYS UTL_HTTP SYS EXECUTE NO NO

 

3. object 권한을 주면 해결이 된다.

https://stackoverflow.com/questions/27379194/grant-utl-http-permission-in-plsql

$ sqlplus "/as sysdba"

SQL> grant execute on UTL_HTTP to system;

SQL> conn system/123456

SQL> desc UTL_HTTP

 

SQL> select * from dba_tab_privs where table_name = 'UTL_HTTP';

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
SCOTT SYS UTL_HTTP SYS EXECUTE NO NO
SYSTEM SYS UTL_HTTP SYS EXECUTE NO NO

 

4. 컴파일할 때 발생되었던 에러는 사라졌으나, 막상 프로시저를 실행시켰더니 다음과 같은 에러가 발생하였다.

ERROR at line 1:
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1577
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at line 1

 

5. 여기에도 ACL권한을 부여해야 한다는 것이다. 등록되어있지 않다면 등록을 해줘야한다.

SQL> select * from dba_network_acl_privileges;

ACL ACLID PRINCIPAL PRIVILEGE IS_GRANT INVERT START_DATE END_DATE

SQL> select * from dba_network_acls;

HOST LOWER_PORT UPPER_PORT ACL ACLID

등록(생성)은 이렇게 하자

begin
    dbms_network_acl_admin.create_acl(
        acl=>'test.xml',
        description=>'test', -> description 빼도 될것같아서 기입을 안했더니 에러 발생
        principal=>'SYSTEM',
        is_grant=>true,
        privilege=>'connect',
        start_date=>'sysdate);

    dbms_network_acl_admin.add_privilege(

        acl=>'test.xml',
        description=>'test',
        principal=>'SYSTEM',
        is_grant=>true,
        privilege=>'resolve');

    dbms_network_acl_admin.assign_acl(
        acl=>'test.xml',
        host=>'api.goodgods.com');

    commit;
end;
/

삭제가 필요하다면

begin
    dbms_network_acl_admin.drop_acl(
        acl=>'test.xml');
end;
/

SQL> select * from dba_network_acl_privileges;

ACL ACLID PRINCIPAL PRIVILEGE IS_GRANT INVERT START_DATE END_DATE
/sys/acls/test.xml EFFEFASDf234DFADf SYSTEM connect true false 2022/06/21  
/sys/acls/test.xml EFFEFASDf234DFADf SYSTEM resolve true false 2022/06/21  

SQL> select * from dba_network_acls;

HOST LOWER_PORT UPPER_PORT ACL ACLID
api.goodgods.com     /sys/acls/test.xml EFFEFASDf234DFADf

* 참고로 12c 부터 아래 object로 변경되었다.

dba_network_acl_privileges => DBA_HOST_ACES

dba_network_acls => DBA_HOST_ACLS

 

6. 프로시저가 제대로 작동하는 것을 알 수 있을 것이다.

이것은 11g부터 적용된 사항이라 하며, 10g 이하 버전은 해당사항이 없다고 한다.

다만 UTL_HTTP 권한 정도는 확인을 하자.(본 글 "3. object 권한을 주면 해결이 된다." 참고)

 

 

7. 참고 URL(더 상세하게 나와있으니 참고하자)

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=nkyle9361&logNo=220676267478

 

UTL_HTTP를 이용한 HTTP 통신

UTL_HTTP를 이용한 HTTP 통신 출처 : ransu.tistory.com/26 1. GET 방식 SELECT UT...

blog.naver.com

https://blog.naver.com/PostView.naver?blogId=nkyle9361&logNo=221989499061&parentCategoryNo=&categoryNo=1&viewDate=&isShowPopularPosts=false&from=postView 

 

utl_http 를 사용하기 위한 ACL 권한설정

오라클 HTTP 통신을 하기 위한 ACL 목록등록 1. ACL 생성 ( DBA 계정으로 ) DECLARE ...

blog.naver.com

 

반응형