寫了一個存儲過程用於自動發郵件,運行時報: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;