如何创建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
相关产品推荐
相关产品推荐

