在oralce 11g中假如你想获取server的ip或者hostname,执行如下语句
SELECT utl_inaddr.get_host_address FROM dual; //获取IP
SELECT utl_inaddr.get_host_name FROM dual; //获取host 名字
如果在oracle 9i中能够正常执行,但在11g中你可能会得到一个莫名其妙的错误提示:
ORA-24247: network access denied by access control list(ACL)
你可能马上想到是需要啥额外的权限,而我们平时赋予权限一般是grant XXX to user_name;但你找不到有啥跟ACL对应的权限.
实际上这里确实需要额外权限,但赋予权限的方式相当变态,跟grant的方式太不一样了.
细粒度访问网络服务
为了更细致的控制网络权限,Oracle 11g中针对这么几个PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)的访问设置了单独的权限访问控制方式.
其中UTL_SMTP,UTL_MAIL是跟邮件相关的,比如你可以在触发器中设定当在某些表中做插入删除操作时就发个邮件知识某个负责人.
赋予权限
假如要给用户赋予访问上面提到的那些函数咋整呢? 要通过如下的一段pl/sql语句
BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl =>'abc.xml', --这个xml文件名字随便取的,但不同出现同名的情况
description =>'ACL list',
principal =>'ARWEN', --表示赋予权限给哪个用户
is_grant =>true, --为true表示赋予权限,如果是false相当取消权限
privilege=>'connect');
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl =>'abc.xml',
principal =>'ARWEN',
is_grant =>true,
privilege=>'resolve');
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl =>'abc.xml',
host=>'Oracle_Host_name'); --因为那些网络操作的权限是针对某一个server的,所以这里是指定一台机器的名字
END;
如果要删除上面的控制列表
BEGIN
DBMS_NETWORK_ACL_ADMIN.drop_acl ( acl => 'abc.xml');
END;
删除这个列表,那用些列表赋予权限的那些用户自然也被取消相应的权限了.
关于DBMS_NETWORK_ACL_ADMIN的详细介绍参看Oracle 官方文档:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_networkacl_adm.htm