Oracle Database 11g以降のバージョンで、アウトバウンド・メールを送信したり、Webサービスを使用したり、Oracle Application ExpressのPDFレポート出力を使用するには、ネットワーク・サービスを有効にする必要があります。
APEX_180100
データベース・ユーザーに対して、任意のホストへの接続権限を付与する方法を示します。DBMS_NETWORK_ACL_ADMIN
のプロシージャCREATE_ACL
、ASSIGN_ACL
、ADD_PRIVILEGE
およびCHECK_PRIVILEGE
は、Oracle Database 12cでは非推奨です。APPEND_HOST_ACE
を使用することをお薦めします。ネットワーク・サービスを有効化すると、Oracle Application Expressでのアウトバウンド・メールの送信、Oracle Application ExpressでのWebサービスの使用、PDFレポートの出力に対するサポートが有効になります。
Oracle Database 11gリリース2以降では、ネットワーク・サービスとの通信機能が、デフォルトで無効化されています。このため、Oracle Database 11gリリース2以降でOracle Application Expressを実行している場合は、新しいDBMS_NETWORK_ACL_ADMIN
パッケージを使用して、APEX_180100
データベース・ユーザーにすべてのホストに対する接続権限を付与する必要があります。これらの権限を付与しないと、次の場合に問題が発生します。
Oracle Application Expressでアウトバウンド・メールを送信する。
ユーザーはAPEX_MAIL
パッケージからメソッドをコールできますが、アウトバンド・メールの送信時に問題が発生します。
Oracle Application ExpressでWebサービスを使用する。
PDFレポートを印刷する。
ヒント:
このセクションで示されている例を実行するには、データベースのcompatible初期化パラメータが11.1.0.0.0以上に設定されている必要があります。デフォルトでは、11gまたは12cデータベースのパラメータは事前に適切に設定されますが、以前のバージョンから11gまたは12cにアップグレードされたデータベースのパラメータは適切に設定されない場合があります。データベース初期化パラメータの変更の詳細は、『Oracle Database管理者ガイド』のOracle Databaseの作成と構成に関する項を参照してください。
APEX_180100
データベース・ユーザーに対して、任意のホストへの接続権限を付与する方法を示します。
次の例は、APEX_180100
データベース・ユーザーに対して、任意のホストへの接続権限を付与する方法を示しています。この例では、Oracle Application Expressがインストールされているデータベースに、SYSDBA
ロールが指定されているSYS
として接続するとします。
DECLARE ACL_PATH VARCHAR2(4000); BEGIN -- Look for the ACL currently assigned to '*' and give APEX_180100 -- the "connect" privilege if APEX_180100 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_180100', 'connect') IS NULL THEN DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH, 'APEX_180100', 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_180100', 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_180100 -- the "connect" privilege if APEX_180100 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_180100', 'connect') IS NULL THEN DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH, 'APEX_180100', 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_180100', TRUE, 'connect'); DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('local-access-users.xml','localhost'); END; / COMMIT;
DBMS_NETWORK_ACL_ADMIN
のプロシージャCREATE_ACL
、ASSIGN_ACL
、ADD_PRIVILEGE
およびCHECK_PRIVILEGE
は、Oracle Database 12cでは非推奨です。APPEND_HOST_ACE
を使用することをお薦めします。
次の例は、APEX_180100
データベース・ユーザーに対して、任意のホストへの接続権限を付与する方法を示しています。この例では、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_180100', 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_180100', principal_type => xs_acl.ptype_db)); END; /
問合せを実行して無効な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_180100
ユーザーにACLを適用する必要があります。