项目要求每个星期执行一次C#后台代码,写了一个http请求的存储过程以便每个星期固定时间访问一次后台代码, 用call SP_XXX();执行存储过程,报出如下异常
ORA-29273: HTTP 请求失败
ORA-06512: 在 "SYS.UTL_HTTP", line 1130
ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝
ORA-06512: 在 "YGMM.P_SENDSMS_TEST", line 15
ORA-06512: 在 line 3
原因:Oracle 11g引入了细粒度访问网络服务.通过在XML DB 数据库中使用访问控制列表(ACL)来实现,允许控制哪个用户能够访问哪个网络资源。
解决办法:
1、给当前Oracle登入用户配置ACL 权限
begin
dbms_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'
,
-- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题
lower_port => 9000,
-- 允许访问的起始端口号
upper_port =>
Null
-- 允许访问的截止端口号
);
commit
;
end
;
如需其他删除权限等操作,可以访问如下网址
http://www.2cto.com/database/201404/290719.html。
最后再执行存储过程,发现可以访问到后台代码了。