You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建Oracle类DBA只读权限用户?查询SYS.ALL_ARGUMENTS无结果

解决Oracle中创建只读类DBA权限用户访问HR schema数据字典的问题

首先咱们拆解下你遇到的核心问题:你创建的用户bbb虽然有SELECT ANY TABLE和SELECT ON SYS.ALL_ARGUMENTS权限,但查询时看不到HR schema的数据,这是因为数据字典视图ALL_ARGUMENTS只会显示当前用户有权限访问的对象的参数信息。而DBA或IMP_FULL_DATABASE角色能查到,是因为它们包含了全库对象的访问权限,但确实权限过高,完全没必要。

下面是更合理的权限配置方案,既能满足查询需求,又不会赋予不必要的高权限:

步骤1:创建用户并赋予基础会话权限

这部分你已经完成了,我再完整梳理一遍:

CREATE USER bbb IDENTIFIED BY bbb;
GRANT CREATE SESSION TO bbb;

步骤2:赋予数据字典访问的精准权限

不需要用DBA角色,Oracle提供了专门用于访问数据字典的SELECT_CATALOG_ROLE角色,权限远低于DBA,完全够用:

GRANT SELECT_CATALOG_ROLE TO bbb;

步骤3:赋予HR schema对象的必要访问权限

要让ALL_ARGUMENTS显示HR的内容,需要确保用户对HR的子程序(存储过程、函数、包)有访问权限。你可以直接批量赋予HR所有对象的只读/执行权限:

GRANT SELECT, EXECUTE ON HR.* TO bbb;

如果想更精准(比如只需要访问子程序),可以用PL/SQL批量授予EXECUTE权限:

BEGIN
  FOR rec IN (SELECT owner, object_name FROM dba_objects WHERE owner='HR' AND object_type IN ('PROCEDURE','FUNCTION','PACKAGE')) LOOP
    EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || rec.owner || '.' || rec.object_name || ' TO bbb';
  END LOOP;
END;
/

验证查询

切换到bbb用户执行你的查询语句:

SELECT * FROM SYS.ALL_ARGUMENTS a WHERE a.OWNER = 'HR' ORDER BY SEQUENCE;

现在应该能正常返回HR schema的对象参数信息了。

额外优化方案

如果你的需求只是查看数据字典中的元数据,不需要实际访问HR的表或子程序,那可以直接授予DBA_ARGUMENTS的查询权限(这个视图显示全库所有对象的参数,不受用户权限过滤):

GRANT SELECT ON SYS.DBA_ARGUMENTS TO bbb;

这种方式权限更精准,用户不需要访问HR的实际对象就能查到目标数据。

内容的提问来源于stack exchange,提问作者Maor Zilberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:35:22