写了一个存储过程用于自动发邮件,运行时报:ORA-24247 网络访问被访问控制列表 (ACL) 拒绝
上网收集了一些资料,原来是Oracle 11g加入了一个访问控制列表(ACL)用来控制网络访问,在访问外部网络地址前需要进行配置。
弄了个脚本添加了一个访问邮箱服务器的权限
set linesize 8000 set serveroutput on set sqlblanklines on exec DBMS_NETWORK_ACL_ADMIN.create_acl ( acl => ‘acl_e900_email_server.xml‘, description => ‘User JDE send Email by 11.0.0.1‘, principal => ‘HAHAHA‘, is_grant => TRUE, privilege => ‘connect‘, start_date => SYSTIMESTAMP , end_date => NULL); COMMIT; exec DBMS_NETWORK_ACL_ADMIN.assign_acl ( acl => ‘acl_e900_email_server.xml‘, host => ‘11.0.0.1‘, lower_port => 25, upper_port => NULL); COMMIT;
以下是一份完整比较详尽的配置脚本:
------------------------------------ -- 创建ACL: ------------------------------------ BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( ACL => ‘/sys/acls/BRDG_BMS_TO_OA.xml‘, --命名 DESCRIPTION => ‘ACL list‘, --描述 PRINCIPAL => ‘CHD_ACT_FOR_BUG_PROJ‘, --要赋权限的用户 IS_GRANT => TRUE, --true表示赋权,false表示取消赋权 PRIVILEGE => ‘connect‘ ); DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE( ACL => ‘/sys/acls/BRDG_BMS_TO_OA.xml‘, PRINCIPAL => ‘CHD_ACT_FOR_BUG_PROJ‘, IS_GRANT => TRUE, PRIVILEGE => ‘resolve‘ ); DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( ACL => ‘/sys/acls/BRDG_BMS_TO_OA.xml‘, HOST =>‘*‘, --主机名,可以指定主机名,也可以使用*做为通配 lower_port=> 1, --端口配置视情况而定,若需要精确控制可限定主机端口范围 upper_port=> 9999 ); commit; END; ------------------------------------ -- 删除ACL:(与assign相对应) ------------------------------------ -- 删除acl这个列表文件,使用它的用户也就取消了对应的权限 begin dbms_network_acl_admin.drop_acl( ‘/sys/acls/BRDG_BMS_TO_OA.xml‘ ); commit; end;