6.6 Oracle Databaseのネットワーク・サービスの有効化
Oracle APEXでアウトバウンド・メールを送信したり、Webサービスを使用したり、BI PublisherによるテンプレートベースのPDFレポートの出力を使用するには、Oracle Databaseでネットワーク・サービスを有効にする必要があります。
- ネットワーク・サービスを有効化する場合と理由
ネットワーク・サービスを有効化すると、Oracle APEXでのアウトバウンド・メールの送信、APEXでのWebサービスの使用、およびBI Publisherを使用したPDFレポートの出力に対するサポートが有効になります。 - Oracle Database 12c以降での接続権限の付与
DBMS_NETWORK_ACL_ADMIN
のプロシージャCREATE_ACL
、ASSIGN_ACL
、ADD_PRIVILEGE
およびCHECK_PRIVILEGE
は、Oracle Database 12cでは非推奨となっています。APPEND_HOST_ACE
を使用することをお薦めします。 - 無効なACLエラーのトラブルシューティング
問合せを実行して、無効なACLエラーがある場合に特定する方法を理解します。
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管理者ガイドのデータベースの互換性レベルの指定を参照してください。
6.6.2 Oracle Database 12c以降での接続権限の付与
DBMS_NETWORK_ACL_ADMIN
内のプロシージャCREATE_ACL
、ASSIGN_ACL
、ADD_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を適用する必要があります。