簡單點說:Oracle允許使用幾個PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)訪問外部網絡服務。需要進行權限授權纔可以,比如需要通過oracle發送郵件。
下面是幾個常用的定義acl的相關方法:
1. 創建訪問控制列表
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'www.xml',
description => 'WWW ACL',
principal => 'HR', -- 賦予權限給哪個用戶
is_grant => true, -- true表示授予權限 false表示取消權限
privilege => 'connect');
2. 使用ADD_PRIVILEGE存儲過程將其他的用戶或角色添加到訪問控制列表中,它的參數與CREATE_ACL存儲過程的參數類似,
省略了DESCRIPTION參數,同時增加了POSITION參數,它用於設置優先順序。
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'www.xml',
principal => 'HR',
is_grant => true,
privilege => 'resolve');
3.使用ASSIGN_ACL存儲過程給網絡分配訪問控制列表
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'www.xml',
host => '*.qq.com'); --主機名,域名,ip地址或分配的子網,主機名大小寫敏感,ip地址和域名允許使用通配符
4.UNASSIGN_ACL存儲過程允許你手動刪除訪問控制列表,它使用的參數與ASSIGN_ACL存儲過程相同,使用NULL參數作爲通配符。
DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL(host => 'www.qq.com');
5.刪除上面的控制列表
DBMS_NETWORK_ACL_ADMIN.drop_acl ( acl => 'www.xml');
6. 查詢創建的ACL信息
SELECT host, lower_port, upper_port, acl,
DECODE(
DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE_ACLID(aclid, 'HR', 'connect'),
1, 'GRANTED', 0, 'DENIED', NULL) privilege
FROM dba_network_acls
from :http://blog.itpub.net/29196873/viewspace-1068135/
////////////////////實例//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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發郵件過程,成功發送郵件。
from:http://blog.chinaunix.net/uid-23284114-id-3435541.html
另外可以參考:http://blog.chinaunix.net/uid-23284114-id-3435541.html