3

最近、Oracle 10g から 11g に切り替えましたが、メール機能が機能しないことに気付き、エラーが発生しました。

ORA-24247: network access denied by access control list (ACL)

そのため、少しグーグルで調べたところ、Oracle 11g の新機能により、utl_smtp を含む特定のパッケージの使用が制限されていることがわかりました。簡単な解決策を探しているので、Oracle のドキュメントは読みませんでしたが、より簡単な解決策を探していて、次のチュートリアルに出会いました。

https://www.pythian.com/blog/setting-up-network-acls-in-oracle-11g-for-dummies/

少しいじりましたが、よくわからなかったので、2 つの個別の構成 .xml ファイルを追加したと思います。私の質問の最初の部分は - どうすれば削除できますか?

2 番目の質問は次のとおりです。

ユーザーにいくつかの許可を追加した後、それが機能するかどうかをテストしようとしましたが、すぐに機能しないことに気付きました:

  SELECT DECODE(
         DBMS_NETWORK_ACL_ADMIN.check_privilege('netacl.xml', 'TEST1', 'connect'),
         1, 'GRANTED', 0, 'DENIED', NULL) privilege 
FROM dual;

戻り値:

PRIVILE
-------
DENIED

なぜですか?(これはソートされています)

質問の 3 番目の部分 - 読んだ後、拒否されました。次のように修正しようとします。

BEGIN
  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('netacl.xml' ,'TEST1', TRUE, 'connect');
END;

しかし、それは私にエラーを与えます:

Ora19279 - XQuery dynamic type mismatch.....(more text meaning nothing to me).

なぜですか?(私は、同じユーザーに同じ権限を2回付与すると、そのエラーが発生することを理解しました)

アップデート

以下のケビンスキーの提案された回答に従い、その過程でかなりのことを学びましたが、まだ問題があります。それでも ORA-24247: アクセス制御リスト (ACL) によってネットワーク アクセスが拒否されました。提案どおりに他のすべてを行ったので、問題は最初に追加した構成ファイルである可能性があると考え始めていますが、その名前を思い出せないため、今は削除できません。誰かが私を助けることができれば、とても感謝しています。

結果(私はいくつかの異なることを試していたので):

select * from dba_network_acls;

戻り値

*                              | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
myservername.com               | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
myDBName                       | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
mailServerDomainName           | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
mailserver.myDomain.local      | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
4

1 に答える 1

9

私はこのアップグレードを行いましたが、それは何時間もの作業でした。バージョン 12 では、すべて別の方法でやり直す必要があります。すべてのプロシージャ コールにはコミットが必要です。一般的な考え方は、アクセスを作成し、詳細を追加し、権限を付与することです。あなたは知らなければならない:

  • メールサーバー名とポート
  • アクセスするためにユーザーとパスワードが必要かどうか (おそらく不要)
  • メールパッケージを呼び出すユーザー。メールパッケージも所有している場合は簡単です
/*create the access permission to connect*/

BEGIN

  DBMS_NETWORK_ACL_ADMIN.create_acl (
    acl          => 'utl_smtp.xml', 
    description  => 'access to smtp email',
    principal    => 'YourUser',
    is_grant     => TRUE, 
    privilege    => 'connect',
    start_date   => SYSTIMESTAMP,
    end_date     => NULL);

  COMMIT;

END;

--add the privilege to resolve names

BEGIN

  DBMS_NETWORK_ACL_ADMIN.add_privilege (
    acl          => 'utl_smtp.xml', 
    principal    => 'YourUser',
    is_grant     => TRUE, 
    privilege    => 'resolve');

  COMMIT;

END;

--assign your mailserver

BEGIN

  DBMS_NETWORK_ACL_ADMIN.assign_acl (
    acl => 'utl_smtp.xml',
    host => 'mailserver.YourDomain.local', 
    lower_port => 25,
    upper_port => NULL); 
    commit;

END;


  BEGIN

  DBMS_NETWORK_ACL_ADMIN.assign_acl (
    acl => 'utl_smtp.xml',
    host => 'YourDBName', 
    lower_port => 25,
    upper_port => NULL); 

  COMMIT;

  END;

  --more housekeeping

  alter system set smtp_out_server = 'mailserver.YourDomain.local:25' scope = both;

 --make sure the user can access the smtp packages

 GRANT EXECUTE ON UTL_TCP TO YourUser;
 GRANT EXECUTE ON UTL_SMTP TO YourUser;
 GRANT EXECUTE ON UTL_MAIL TO YourUser;

--check your work

select * from dba_network_acls;

--verify permissions for your user

SELECT DECODE(
DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(
   'utl_smtp.xml', 'YourUser', 'resolve'),
1, 'GRANTED', 0, 'DENIED', NULL) PRIVILEGE 
FROM DUAL;

--if you have created access permissions you wish to delete
--using the information from the select use this to delete what you don't want

exec DBMS_NETWORK_ACL_ADMIN.DROP_ACL ('acl_utl_smtp.xml');

--for more troubleshooting try this barebones mail procedure, run with your user. Copied from [here][1]
DECLARE
v_From      VARCHAR2(80) := 'oracle@mycompany.com';
v_Recipient VARCHAR2(80) := 'test@mycompany.com';
v_Subject   VARCHAR2(80) := 'test subject';
v_Mail_Host VARCHAR2(30) := 'mail.mycompany.com';
v_Mail_Conn utl_smtp.Connection;
crlf        VARCHAR2(2)  := chr(13)||chr(10);
BEGIN
v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25);
utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);
utl_smtp.Mail(v_Mail_Conn, v_From);
utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);
utl_smtp.Data(v_Mail_Conn,
'Date: '   || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf ||
'From: '   || v_From || crlf ||
'Subject: '|| v_Subject || crlf ||
'To: '     || v_Recipient || crlf ||
crlf ||
'some message text'|| crlf ||   -- Message body
'more message text'|| crlf
 );
utl_smtp.Quit(v_mail_conn);
EXCEPTION
WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then
raise_application_error(-20000, 'Unable to send mail', TRUE);
END;
于 2016-06-14T16:37:15.027 に答える