B.5 Oracle Database 11g以降のネットワーク・サービスの有効化
Oracle Database 11g以降のバージョンで、アウトバウンド・メールを送信したり、Webサービスを使用したり、Oracle Application ExpressのPDFレポート出力を使用するには、ネットワーク・サービスを有効にする必要があります。
- ネットワーク・サービスを有効化する必要があるタイミングと理由
ネットワーク・サービスを有効化すると、Oracle Application Expressでのアウトバウンド・メールの送信、Oracle Application ExpressでのWebサービスの使用、PDFレポートの出力に対するサポートが有効になります。 - Oracle Database 12cより前の接続権限の付与
APEX_180200
データベース・ユーザーに対して、任意のホストへの接続権限を付与する方法を示します。 - Oracle Database 12c以降での接続権限の付与
DBMS_NETWORK_ACL_ADMIN
のプロシージャCREATE_ACL
、ASSIGN_ACL
、ADD_PRIVILEGE
およびCHECK_PRIVILEGE
は、Oracle Database 12cでは非推奨です。APPEND_HOST_ACE
を使用することをお薦めします。 - 無効なACLエラーのトラブルシューティング
問合せを実行して無効なACLエラーを特定する方法を理解します。
B.5.1 ネットワーク・サービスを有効化する必要があるタイミングと理由
ネットワーク・サービスを有効化すると、Oracle Application Expressでのアウトバウンド・メールの送信、Oracle Application ExpressでのWebサービスの使用、PDFレポートの出力に対するサポートが有効になります。
Oracle Database 11gリリース2以降では、ネットワーク・サービスとの通信機能が、デフォルトで無効化されています。このため、Oracle Database 11gリリース2以降でOracle Application Expressを実行している場合は、新しいDBMS_NETWORK_ACL_ADMIN
パッケージを使用して、APEX_180200
データベース・ユーザーにすべてのホストに対する接続権限を付与する必要があります。これらの権限を付与しないと、次の場合に問題が発生します。
-
Oracle Application Expressでアウトバウンド・メールを送信する。
ユーザーは
APEX_MAIL
パッケージからメソッドをコールできますが、アウトバンド・メールの送信時に問題が発生します。 -
Oracle Application ExpressでWebサービスを使用する。
-
PDFレポートを印刷する。
ヒント:
このセクションで示されている例を実行するには、データベースのcompatible初期化パラメータが11.1.0.0.0以上に設定されている必要があります。デフォルトでは、11gまたは12cデータベースのパラメータは事前に適切に設定されますが、以前のバージョンから11gまたは12cにアップグレードされたデータベースのパラメータは適切に設定されない場合があります。データベース初期化パラメータの変更の詳細は、『Oracle Database管理者ガイド』のOracle Databaseの作成と構成に関する項を参照してください。
B.5.2 Oracle Database 12cより前の接続権限の付与
APEX_180200
データベース・ユーザーに対して、任意のホストへの接続権限を付与する方法を示します。
次の例は、APEX_180200
データベース・ユーザーに対して、任意のホストへの接続権限を付与する方法を示しています。この例では、Oracle Application Expressがインストールされているデータベースに、SYSDBA
ロールが指定されているSYS
として接続するとします。
DECLARE
ACL_PATH VARCHAR2(4000);
BEGIN
-- Look for the ACL currently assigned to '*' and give APEX_180200
-- the "connect" privilege if APEX_180200 does not have the privilege yet.
SELECT ACL INTO ACL_PATH FROM DBA_NETWORK_ACLS
WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;
IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(ACL_PATH, 'APEX_180200',
'connect') IS NULL THEN
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH,
'APEX_180200', TRUE, 'connect');
END IF;
EXCEPTION
-- When no ACL has been assigned to '*'.
WHEN NO_DATA_FOUND THEN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('power_users.xml',
'ACL that lets power users to connect to everywhere',
'APEX_180200', TRUE, 'connect');
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('power_users.xml','*');
END;
/
COMMIT;
次の例は、ローカル・ネットワーク・リソースへのアクセス権について、より少ない権限を付与する方法を示しています。この例では、電子メールやレポート・サーバーなど、ローカル・ホストのサーバーへのアクセスのみを有効にします。
DECLARE
ACL_PATH VARCHAR2(4000);
BEGIN
-- Look for the ACL currently assigned to 'localhost' and give APEX_180200
-- the "connect" privilege if APEX_180200 does not have the privilege yet.
SELECT ACL INTO ACL_PATH FROM DBA_NETWORK_ACLS
WHERE HOST = 'localhost' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;
IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(ACL_PATH, 'APEX_180200',
'connect') IS NULL THEN
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH,
'APEX_180200', TRUE, 'connect');
END IF;
EXCEPTION
-- When no ACL has been assigned to 'localhost'.
WHEN NO_DATA_FOUND THEN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('local-access-users.xml',
'ACL that lets users to connect to localhost',
'APEX_180200', TRUE, 'connect');
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('local-access-users.xml','localhost');
END;
/
COMMIT;
B.5.3 Oracle Database 12c以降での接続権限の付与
DBMS_NETWORK_ACL_ADMIN
のプロシージャCREATE_ACL
、ASSIGN_ACL
、ADD_PRIVILEGE
およびCHECK_PRIVILEGE
は、Oracle Database 12cでは非推奨です。APPEND_HOST_ACE
を使用することをお薦めします。
次の例は、APEX_180200
データベース・ユーザーに対して、任意のホストへの接続権限を付与する方法を示しています。この例では、Oracle Application Expressがインストールされているデータベースに、SYSDBA
ロールが指定されているSYS
として接続するとします。
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'APEX_180200',
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_180200',
principal_type => xs_acl.ptype_db));
END;
/
B.5.4 無効な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_180200
ユーザーにACLを適用する必要があります。