2021年8月12日木曜日

Autonomous DatabaseのAPEXでUTL_HTTPを使用する

 UTL_HTTPが動かない、との相談があったので検証してみました。

Autonomous DatabaseでのUTL_HTTPの使用には制限があります。以下の内容に該当していないのが前提です。

共有Exadataインフラストラクチャ上のOracle Autonomous Databaseの使用
PL/SQLパッケージの制限 - UTL_HTTPの制限

以下のURLをテストで呼び出してみます。

https://static.oracle.com/cdn/apex/21.1.2/apex_version.txt

DECLARE
    req   UTL_HTTP.REQ;
    resp  UTL_HTTP.RESP;
    value raw(1024);
BEGIN
    utl_http.set_wallet('');
    req := UTL_HTTP.BEGIN_REQUEST('https://static.oracle.com/cdn/apex/21.1.2/apex_version.txt');
    UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
    resp := UTL_HTTP.GET_RESPONSE(req);
    UTL_HTTP.READ_raw(resp, value, 1024);
    dbms_output.put_line(utl_raw.cast_to_varchar2(value));
    UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
    WHEN UTL_HTTP.END_OF_BODY THEN
        UTL_HTTP.END_RESPONSE(resp);
END;
実行すると以下が表示されます。

Application Express Version: 21.1


以下のコードによってACLを定義します。principalとして、ワークスペースの解析対象スキーマを指定します。
begin
dbms_network_acl_admin.create_acl(acl => 'test-oracle-cdn.xml',
description => 'Oracle CDN Access',
principal => 'APEXDEV',
is_grant => true,
privilege => 'connect');
--
dbms_network_acl_admin.assign_acl(acl => 'test-oracle-cdn.xml',
host => 'static.oracle.com');
--
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'test-oracle-cdn.xml',
principal => 'APEXDEV',
is_grant => true,
privilege => 'resolve');
end;
/
または以下のコードでも定義できます。ACLの名称はシステムによって決められます。
begin
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host => 'static.oracle.com',
    ace => xs$ace_type(
        privilege_list => xs$name_list('connect','resolve'),
        principal_name => 'APEXDEV',
        principal_type => xs_acl.ptype_db));
  commit; 
end;
/
データベース・アクション開発SQLから実行します。


登録されているACLの確認には以下のSQLが使用できます。APEXDEVはワークスペースのスキーマになります。connectの部分はresolveに変更すると、resolveの権限について確認できます。

select host, acl,
decode(dbms_network_acl_admin.check_privilege_aclid(aclid, 'APEXDEV', 'connect'), 1, 'GRANTED', 0, 'DENIED', NULL) privilege
from dba_network_acls;


ACLからホストを取り除いたり、ACLを削除するには以下のスクリプトを呼び出します。ACL名やhostなどの引数は環境に合わせて変更します。

begin
dbms_network_acl_admin.unassign_acl(acl => 'test-oracle-cdn.xml',
host => 'static.oracle.com');
dbms_network_acl_admin.drop_acl(acl => 'test-oracle-cdn.xml');
end;
/

以上になります。

Oracle APEXのアプリケーション開発の参考になれば幸いです。