项目要求每个星期执行一次 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
description
=>
'HTTP
Access'
,
--
描述
principal
=>
'ITS'
,
--
授权或者取消授权账号,大小写敏感(用大写可以,小写报错)
is_grant
=>
TRUE
,
--
授权还是取消授权
privilege
=>
'connect'
,
--
授权或者取消授权的权限列表
start_date
=>
null
,
--
起始日期 最好写上起始日期,没写权限一会就失效
end_date
=>
null
-- 结束日期
最好写上起始日期,没写权限一会就失效
);
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。
最后再执行存储过程,发现可以访问到后台代码了。