6.6 Oracle Databaseのネットワーク・サービスの有効化

Oracle APEXでアウトバウンド・メールを送信したり、Webサービスを使用したり、BI PublisherによるテンプレートベースのPDFレポートの出力を使用するには、Oracle Databaseでネットワーク・サービスを有効にする必要があります。

6.6.1 ネットワーク・サービスを有効化する場合と理由

ネットワーク・サービスを有効化すると、Oracle APEXでのアウトバウンド・メールの送信、APEXでのWebサービスの使用、BI Publisherを使用したPDFレポートの出力に対するサポートが有効になります。

Oracle Database 11gリリース2以降では、ネットワーク・サービスとの通信機能が、デフォルトで無効化されています。このため、Oracle Database 11gリリース2以降とともにOracle APEXを実行している場合は、新しいDBMS_NETWORK_ACL_ADMINパッケージを使用して、APEX_220200データベース・ユーザーにすべてのホストに対する接続権限を付与する必要があります。これらの権限を付与しないと、次の場合に問題が発生します。

  • Oracle APEXでアウトバウンド・メールを送信する。

    ユーザーはAPEX_MAILパッケージからメソッドをコールできますが、アウトバンド・メールの送信時に問題が発生します。

  • APEXからWebサービスを使用する。
  • APEXからアウトバウンドLDAPコールを実行する。
  • BI Publisherを使用してPDFレポートを出力する。

ノート:

古いAPEXバージョンの構成に基づいて12c以上のデータベース上でAPEXをアップグレードすると、アップグレードによってネットワーク・サービスが自動的に構成されます。

ヒント:

このセクションで示されている例を実行するには、データベースのcompatible初期化パラメータが11.1.0.0.0以上に設定されている必要があります。デフォルトでは、11gまたは12cデータベースのパラメータは事前に適切に設定されますが、以前のバージョンから11gまたは12cにアップグレードされたデータベースについては、パラメータが適切に設定されない場合があります。データベース初期化パラメータの変更については、Oracle Multitenant管理者ガイドデータベースの互換性レベルの指定を参照してください。

参照:

Oracle APEXアプリケーション・ビルダー・ユーザーズ・ガイドレポート出力について

6.6.2 Oracle Database 12c以降での接続権限の付与

DBMS_NETWORK_ACL_ADMIN内のプロシージャCREATE_ACLASSIGN_ACLADD_PRIVILEGEおよびCHECK_PRIVILEGEは、Oracle Database 12cでは非推奨となっています。APPEND_HOST_ACEを使用することをお薦めします。

次の例では、APEX_220200データベース・ユーザーに対してすべてのホストへの接続権限を付与する方法を示します。この例では、Oracle APEXがインストールされているデータベースに、SYSDBAロールが指定されているSYSとして接続するとします。

BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',
        ace => xs$ace_type(privilege_list => xs$name_list('connect'),
                           principal_name => 'APEX_220200',
                           principal_type => xs_acl.ptype_db));
END;
/

次の例は、ローカル・ネットワーク・リソースへのアクセス権について、より少ない権限を付与する方法を示しています。この例では、電子メールやレポート・サーバーなど、ローカル・ホストのサーバーへのアクセスのみを有効にします。

BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => 'localhost',
        ace => xs$ace_type(privilege_list => xs$name_list('connect'),
                           principal_name => 'APEX_220200',
                           principal_type => xs_acl.ptype_db));
END;
/

6.6.3 無効なACLエラーのトラブルシューティング

問合せを実行して、無効なACLエラーがある場合に特定する方法を学習します。

前述のスクリプトを実行した後にORA-44416: 無効なACLのエラーが表示された場合は、次の問合せを使用して、無効なACLを特定します。

REM Show the dangling references to dropped users in the ACL that is assigned
REM to '*'.

SELECT ACL, PRINCIPAL
  FROM DBA_NETWORK_ACLS NACL, XDS_ACE ACE
 WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL AND
       NACL.ACLID = ACE.ACLID AND
       NOT EXISTS (SELECT NULL FROM ALL_USERS WHERE USERNAME = PRINCIPAL);

次に、次のコードを実行してACLを修正します。

DECLARE
  ACL_ID   RAW(16);
  CNT      NUMBER;
BEGIN
  -- Look for the object ID of the ACL currently assigned to '*'
  SELECT ACLID INTO ACL_ID FROM DBA_NETWORK_ACLS
   WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;

  -- If just some users referenced in the ACL are invalid, remove just those
  -- users in the ACL. Otherwise, drop the ACL completely.
  SELECT COUNT(PRINCIPAL) INTO CNT FROM XDS_ACE
   WHERE ACLID = ACL_ID AND
         EXISTS (SELECT NULL FROM ALL_USERS WHERE USERNAME = PRINCIPAL);

  IF (CNT > 0) THEN

    FOR R IN (SELECT PRINCIPAL FROM XDS_ACE
               WHERE ACLID = ACL_ID AND
                     NOT EXISTS (SELECT NULL FROM ALL_USERS
                                  WHERE USERNAME = PRINCIPAL)) LOOP
      UPDATE XDB.XDB$ACL
         SET OBJECT_VALUE =
               DELETEXML(OBJECT_VALUE,
                         '/ACL/ACE[PRINCIPAL="'||R.PRINCIPAL||'"]')
       WHERE OBJECT_ID = ACL_ID;
    END LOOP;

  ELSE
    DELETE FROM XDB.XDB$ACL WHERE OBJECT_ID = ACL_ID;
  END IF;

END;
/

REM commit the changes.

COMMIT;

ACLを修正したら、この項の最初のスクリプトを実行してAPEX_220200ユーザーにそのACLを適用する必要があります。