错误样例(使用UTL_HTTP发送http请求时,报出如下错误):
原因:
1、Oracle允许使用几个PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)访问外部网络服务,这些API都使用TCP协议。
2、在Oracle 10g是通过一个基于用户是否被授予执行某个包的许可的 on/off开关来实现的,Oracle 11g引入了细粒度访问网络服务.
3、通过在XML DB 数据库中使用访问控制列表(ACL)来实现,允许控制哪个用户能够访问哪个网络资源,而不关心包的授权。
解决办法:
-- 查询网络访问控制列表 acl
1
|
Select
*
From
dba_network_acls
|
1
|
Select
*
From
dba_network_acl_privileges
|
1
|
Select
username
From
dba_users
Where
username
Like
'%ITS%'
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
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
;
begin
dbms_network_acl_admin.assign_acl (
-- 可以授权多个主机,或者多个主机的多个端口
acl =>
'utl_http.xml'
,
host =>
'10.100.49.138'
,
lower_port => 80,
upper_port =>
NUll
);
commit
;
end
;
请求测试:
|
1
|
|
移除acl和权限控制
撤销分配acl到hostacl -- 与assign对应
1
2
3
4
5
6
7
8
9
10
11
12
|
begin
dbms_network_acl_admin.unassign_acl(
acl =>
'utl_http.xml'
,
host =>
'100.1.2.1'
,
lower_port => 9000,
upper_port =>
Null
);
end
;
删除用户的权限
|
1
2
3
4
5
6
7
|
begin
dbms_network_acl_admin.delete_privilege(
'utl_http.xml'
,
'ITS'
,
NULL
,
'resolve'
);
end
;
-- 删除acl配置文件
|
1
2
3
4
5
|
begin
dbms_network_acl_admin.drop_acl(
'utl_http.xml'
);
end
;
|