2022. 6. 21. 23:19ㆍOracle/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
'Oracle > Oracle Error' 카테고리의 다른 글
ORA-01950: no privileges on tablespace 'USERS' (0) | 2022.03.24 |
---|---|
[ORA-01017] : invalid username / password; logon denied by SQL developer (0) | 2022.03.24 |
IMP-00032, IMP-00008 (0) | 2012.10.04 |
ORA-02429: 고유/기본 키 적용을 위한 인덱스를 삭제할 수 없습니다. (0) | 2012.04.26 |
ORA-00257 (0) | 2011.09.27 |