在应用中直接上报数据时,获取ORACLE 11G(10g 没事)主机IP和实例时候,执行下列SQL语句出现错误:
SELECT lower(utl_inaddr.get_host_address||':'||SYS_CONTEXT ('USERENV', 'DB_NAME'))
FROM dual ;
试图连接到超级用户,给当前用户授予select any dictionary ,错误依旧
grant select any dictionary to test;
查询了下网上,有说用ORACLE发邮件也出类似错误的,解决方法都差不多,找了个类似的:
ORA-24247: network access denied by access control list (ACL)错误:
ERROR at line 1:
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at "SYS.'UTL_INADDR", line 654
ORA-06512: at "SYS.'UTL_INADDR", line 671
ORA-06512: at line 1
按照其解决方案做了下,果然解决问题,在此记录下:
首先连接到超级用户:
SQL>Conn / as sysdba;
已连接。
SQL>
1 创建 ACL
SQL> begin
2 dbms_network_acl_admin.create_acl (
3 acl => 'UTL_INADDR.xml',
4 description => 'utl_inaddr',
5 principal => 'TEST', --此为将来要进行操作的用户
6 is_grant => TRUE,
7 privilege => 'resolve'
8 );
9 commit;
10 end;
11 /
PL/SQL 过程已成功完成。
2 增加权限
begin
2 dbms_network_acl_admin.add_privilege (
3 acl => 'UTL_INADDR.xml',
4 principal => 'TEST',
5 is_grant => TRUE,
6 privilege => 'connect'
7 );
8 commit;
9 end;
10 /
PL/SQL 过程已成功完成。
3 授予用户权限
SQL> begin
2 dbms_network_acl_admin.assign_acl(
3 acl => 'UTL_INADDR.xml',
4 host => '*'
5 );
6 commit;
7 end;
8 /
PL/SQL 过程已成功完成。
4 再次访问相应的表
SELECT lower(utl_inaddr.get_host_address||':'||SYS_CONTEXT ('USERENV', 'DB_NAME'))
FROM dual ;
fe80::645d:7021:9c8e:419a%11:sq
能够返回相应的信息,只不过此处没有返回正确的IP,而是IPV6的地址
C:\Users\lxy>ipconfig
……
以太网适配器 本地连接:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::645d:7021:9c8e:419a%11
IPv4 地址 . . . . . . . . . . . . : 10.198.1.104
子网掩码 . . . . . . . . . . . . : 255.255.0.0
默认网关. . . . . . . . . . . . . : 10.198.1.254
…..
5 在需要的时候,可执行过程摘除相应的ACL
BEGIN
DBMS_NETWORK_ACL_ADMIN.drop_acl (
acl => 'UTL_INADDR.xml');
COMMIT;
END;
/
用ORACLE发邮件也会遇到这个问题,貌似11G新增了什么限制所致,为何建库的时候没有执行相关脚本呢,在此记录一下!