ACL授权:
BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
acl => 'BANK_RZ_ACL.xml',--(此处名称可随意,但需要上下保持一致)
description => 'Enables network permissions for the image server',
principal => 'RZHFM', --此处用户名必须大写(当前本地数据库用户)
is_grant => TRUE,
privilege => 'connect');
END;
/
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'BANK_RZ_ACL.xml',
host => '
10.1.22.28', --本地SMTP服务器地址
lower_port => '7000',--(本地端口,一般8080)
upper_port => '9000');--(本地端口,一般8080)
COMMIT;
END;
查看ACL是否存在:
Select * From dba_network_acls;
ORA-2424 错误处理及DBMS_NETWORK_ACL_ADMIN用法汇总
通过oracle的存储过程发邮件,出现问题,具体过程如下:
发邮件的存储过程PROC_SENDMAIL_SIMPLE在A用户,而B用户要调用A用的PROC_SENDMAIL_SIMPLE来发邮件。
其中,A用户已经把PROC_SENDMAIL_SIMPLE的执行权限给了B用户
grant execute on PROC_SENDMAIL_SIMPLE to B;
但是在B用户的存储过程中调用PROC_SENDMAIL_SIMPLE依然报错
ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝
ORA-24247: network access denied by access control list (ACL)
发生这个错误是因为网络访问控制列表管理着用户访问网络的权限。
========
解决办法:
========
拥有DBA权限的用户执行下面的SQL,分3部分
BEGIN
--1.创建访问控制列表sendmail.xml,sendmail.xml控制列表拥有connect权限,并把这个权限给了B用户,
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
acl=> 'sendmail.xml', -- ACL的名字,自己定义
description => 'sendmail ACL', -- ACL的描述
principal => 'B', -- 这里是用户名,大写,表示把这个ACL的权限赋给B用户
is_grant => true, --true:授权 ;false:禁止
privilege => 'connect'); --授予或者禁止的网络权限
--2.为sendmail.xml控制列表添加resolve权限,且赋给B用户
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
acl=> 'sendmail.xml',
principal => 'B',
is_grant => true,
privilege => 'resolve');
--3.为控制列表ACL sendmail.xml分配可以connect和resolve的host
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
acl => 'sendmail.xml',
host => 'smtp.163.com'); --smtp.163.com是邮箱服务器主机名
END;
/
COMMIT;
再次在用户B调用A的PROC_SENDMAIL_SIMPLE发邮件过程,成功发送邮件。
(笔者原创文章,转载请注明出处:https://blog.csdn.net/LFCuiYs)谢谢!