Oracle 19c中必须配置网络ACL才能调用Web服务,仅GRANT EXECUTE ON UTL_HTTP无效;需用DBMS_NETWORK_ACL_ADMIN依次执行CREATE_ACL(授connect)、ADD_PRIVILEGE(补resolve,域名场景必需)、ASSIGN_ACL(精确绑定host与端口),全程DBA执行并COMMIT。
直接给结论:oracle 19c 中不能靠 grant execute on utl_http 就让用户发 http 请求,必须用 dbms_network_acl_admin 配 acl —— 否则必报 ora-24247。
为什么 CREATE_ACL 后还连不上?缺 resolve 权限
常见错误是只执行了 CREATE_ACL 并授 connect,但目标 URL 含域名(如 https://api.example.com)时,Oracle 内部需 DNS 解析。没 resolve 权限会卡在主机名解析阶段,报 ORA-29273 + ORA-12545,而非直接的 ORA-24247。
-
connect和resolve是两个独立权限,必须都显式添加到同一 ACL 文件中 -
principal参数必须填数据库中真实存在的用户名,且**全大写**(除非建用户时用了双引号) - 若填了小写名(如
'app_user')、角色名(如'CONNECT')或拼错,ADD_PRIVILEGE不报错但实际不生效
ASSIGN_ACL 的 host 和端口怎么填才匹配请求?
host 不支持正则,只认精确匹配、通配符 * 或带点的完整域名/IP;端口范围宽泛(如 lower_port => 1, upper_port => 65535)虽能跑通,但违反最小权限原则,生产环境应收紧。
- 请求 URL 是
http://service.internal:8080/api→host => 'service.internal',lower_port => 8080,upper_port => 8080 - HTTPS 请求默认端口是
443,别漏掉;HTTP 默认是80,但显式写出更稳妥 -
host => '*'仅限测试,生产禁用;主机名大小写敏感(极少见,但 DNS 策略可能要求Api.Example.Com)
ACL 配完不生效?别忘了 COMMIT 和视图验证
所有 DBMS_NETWORK_ACL_ADMIN 调用都是 DML 操作,不 COMMIT 就不会持久化。另外,ACL 生效依赖两个视图的状态:
-
DBA_NETWORK_ACLS:查ASSIGN_ACL是否已绑定 host/port -
DBA_NETWORK_ACL_PRIVILEGES:查CREATE_ACL和ADD_PRIVILEGE是否成功写入权限 - 如果查询发现某用户在
DBA_NETWORK_ACL_PRIVILEGES中无记录,说明principal名写错或用户不存在
最易被忽略的是:ACL 配置后,用户仍需有 EXECUTE 权限才能调用 UTL_HTTP 包本身(GRANT EXECUTE ON UTL_HTTP TO APP_USER),但这个权限和网络访问控制完全解耦——前者管“能不能用包”,后者管“能不能连出去”。两者缺一不可。


















