OracleDatabase12cのNETWORK_ACL

UTL_MAILやUTL_INETADDRを使う場合に避けて通れないのがDBMS_NETWORL_ACL_ADMINパッケージ。

11gまでサポートされていたCRAETE_ACLなどのサブプロシージャは非推奨となり、代わりにAPPEND_HOST_ACE等を使え、といことらしくハマった。
https://docs.oracle.com/cd/E57425_01/121/ARPLS/d_networkacl_adm.htm#CHDHBHGA

やりたかったこと

OracleDatabase 12cで、あるユーザ(PROC_USER)にUTL_MAILを使ったメール送信処理をプロシージャとして定義させ、それを別ユーザ(PROC_EXEC_USER)で実行させたい。
この時ORA-24247が発生しないよう、NetworkACLを正しく定義したかった。

設定すべきACL

以下で正しく動いた。

/* NetworkACLの定義 */
BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
        host => 'my-smtp-relay-host.mydomain',
        lower_port => 25,
        upper_port => 25,
        ace => XS$ACE_TYPE (
            privilege_list => XS$NAME_LIST (
                'smtp',
                'connect'
            ),
            principal_name => 'PROC_USER',
            principal_type => XS_ACL.PTYPE_DB
        )
    );
END;
/

/* プロシージャの定義例 */
CREATE PROCEDURE PROC_USER.SMTP_TEST_CONN
IS
  c UTL_SMTP.CONNECTION;
BEGIN
  c := UTL_SMTP.OPEN_CONNECTION('my-smtp-relay-host.mydomain');
  UTL_SMTP.HELO(c, 'mydomain');
  UTL_SMTP.MAIL(c, 'user1@mydomain');
  UTL_SMTP.RCPT(c, 'user2@mydomain');
  UTL_SMTP.OPEN_DATA(c);
  UTL_SMTP.CLOSE_DATA(c);
  UTL_SMTP.QUIT(c);
END;
/


/* プロシージャの実行例 */
EXEC PROC_USER.SMTP_TEST_CONN();

aceで設定するprincipal_nameはロール名ではなく、プロシージャを持つユーザ名を指定しないとだめの様子。
例えば、PROC_USERがDBAロールをもっていたとしてもprincipal_name => ‘DBA’ではだめで、principal_name => ‘PROC_USER’とやらなければならない。
またPROC_USERのプロシージャをPROC_EXEC_USERが実行する場合でもprincipal_name => ‘PROC_USER’でなければならない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です