Oracle数据库管理:授予user1全权限后无法查询system用户创建的表
问题根因
- Oracle权限分为系统权限、对象权限两类,常规的「授予全部权限」操作默认仅授予系统权限,不会自动赋予其他用户Schema下私有对象的访问权限。System用户创建的表属于System Schema的私有对象,未单独授权时,其余用户即使持有高等级系统权限也无法访问。
- 访问表时未指定Schema前缀,数据库默认会在当前登录用户的Schema下查找对应表,自然无法匹配到System Schema下的表。
- 若仅为用户授予了
CONNECT、RESOURCE这类基础角色,本身也不包含跨Schema访问其他用户对象的默认权限。
解决方案
方案1:单独授予对象权限(生产环境推荐)
使用System用户登录数据库,执行授权语句,按需授予User1对应表的访问权限:
-- 授予指定表的查询权限 GRANT SELECT ON system.你的表名 TO user1; -- 授予指定表的增删改查全权限 GRANT ALL PRIVILEGES ON system.你的表名 TO user1; -- 批量授予System Schema下所有表的查询权限 BEGIN FOR tab IN (SELECT table_name FROM all_tables WHERE owner = 'SYSTEM') LOOP EXECUTE IMMEDIATE 'GRANT SELECT ON system.'||tab.table_name||' TO user1'; END LOOP; END; /
授权完成后如果不想每次查询都加Schema前缀,可以使用User1登录后创建同义词:
-- 为单个表创建同义词 CREATE SYNONYM 你的表名 FOR system.你的表名; -- 批量为System下所有表创建同义词 BEGIN FOR tab IN (SELECT table_name FROM all_tables WHERE owner = 'SYSTEM') LOOP EXECUTE IMMEDIATE 'CREATE SYNONYM '||tab.table_name||' FOR system.'||tab.table_name; END LOOP; END; /
方案2:授予跨Schema访问系统权限(仅测试环境使用)
如果需要User1拥有访问所有Schema对象的权限,可以直接授予对应系统权限或高等级角色:
-- 授予查询任意Schema下表的权限 GRANT SELECT ANY TABLE TO user1; -- 授予DBA角色(最高管理权限,仅测试环境可使用) GRANT DBA TO user1;
方案3:查询时指定Schema前缀
授权完成后,User1查询时直接在表名前加上system.前缀即可:
SELECT * FROM system.你的表名;
内容的提问来源于stack exchange,提问作者Syla Sem
相关产品推荐
相关产品推荐

