作者:开心宝2502869253 | 来源:互联网 | 2023-10-13 08:06
最近数据库中有张表要用触发器把本机的IP取出来,写到另一张表,使用了UTL_INADDR.GET_HOST_ADDRESS(),结果触发器在执行时报ORA-24247错误。在9i上不会报错,在11G上报错。好容易在网上找到了解决方法,三个步骤解决,在oracle 11GR2 for linux上成功取到了IPV4的IP,记下来:
用sys用户通过sqlplus连接数据库:sqlplus / as sysdba,然后执行以下三个存储过程。
1 创建 ACL
begindbms_network_acl_admin.create_acl (acl => 'UTL_INADDR.xml',description => 'utl_inaddr',principal => 'MYDBUSER', --即将要为之授权的用户,要大写,小写会报找不到该用户is_grant => TRUE,privilege => 'resolve');commit;end;/
2 增加权限
begindbms_network_acl_admin.add_privilege (acl => 'UTL_INADDR.xml',principal => 'MYDBUSER', --即将要为之授权的用户,要大写,小写会报找不到该用户is_grant => TRUE,privilege => 'connect');commit;end;/
3 授予用户权限
begindbms_network_acl_admin.assign_acl(acl => 'UTL_INADDR.xml',host => '*');commit;end;/
延伸:
1、如果想查看一下数据里有几个ACL文件呢?如下:
SELECT * FROM DBA_NETWORK_ACLS
2、如果想看看ACL都为哪些用户授权了呢?如下:
SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES
网上找到一个比较全的对于以上命令的解释,原文地址:https://blog.csdn.net/zxnlmj/article/details/22877743
begindbms_network_acl_admin.create_acl ( -- 创建访问控制文件(ACL)acl => 'utl_http.xml', -- 文件名称description => 'HTTP Access', -- 描述principal => 'ITS', -- 授权或者取消授权账号,大小写敏感is_grant => TRUE, -- 授权还是取消授权privilege => 'connect', -- 授权或者取消授权的权限列表start_date => null, -- 起始日期end_date => null -- 结束日期);dbms_network_acl_admin.add_privilege ( -- 添加访问权限列表项acl => 'utl_http.xml', -- 刚才创建的acl名称 principal => 'ITS', -- 授权或取消授权用户is_grant => TRUE, -- 与上同 privilege => 'resolve', -- 权限列表start_date => null, end_date => null);dbms_network_acl_admin.assign_acl ( -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。acl => 'utl_http.xml',host => '100.1.2.1', -- ip地址或者域名,填写http://localhost:9000/hello与http://localhost:9000/是会报host无效的-- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题lower_port => 9000, -- 允许访问的起始端口号upper_port => Null -- 允许访问的截止端口号);commit;
end;begindbms_network_acl_admin.assign_acl ( -- 可以授权多个主机,或者多个主机的多个端口acl => 'utl_http.xml',host => '10.100.49.138',lower_port => 80,upper_port => NUll);commit;
end;