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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:15:04