Linux服务器Oracle中可访问的table_x不在all_tables列表,如何使其显示?
问题根因
Oracle的all_tables视图存储的是当前用户直接拥有访问权限的所有表的元数据,出现该现象主要有3种常见原因:
- 访问的
table_x实际是同义词而非表,同义词不会被收录到all_tables视图中 - 建表时使用带双引号的语法创建了大小写敏感的表名,查询时未匹配到对应的大小写格式
- 对
table_x的SELECT权限是通过角色间接授予的,all_tables不会展示通过角色权限访问的表
解决步骤
- 第一步:确认
table_x的对象类型和所属用户,执行如下SQL:
SELECT owner, object_name, object_type FROM all_objects WHERE object_name = UPPER('table_x') OR object_name = 'table_x';
查看返回结果的object_type字段:
- 若值为
SYNONYM:说明该对象是同义词,需查询all_synonyms视图查看该对象,若需要对应的基表出现在all_tables中,确保对基表拥有直接授予的SELECT权限即可。 - 若值为
TABLE:记下返回结果的owner字段值,即该表的所属用户。 - 第二步:带上属主和大小写匹配规则查询
all_tables,确认是否存在:
SELECT table_name, owner FROM all_tables WHERE owner = '<第一步查到的OWNER值>' AND (table_name = UPPER('table_x') OR table_name = 'table_x');
- 若该SQL有返回结果,说明之前仅查询
table_name字段时因分页、大小写匹配问题漏看,不需要额外操作。 - 第三步:若上述SQL无返回结果,需要让表属主给当前查询用户直接授予SELECT权限:
使用表属主账号执行授权命令:
授权完成后再次查询GRANT SELECT ON <OWNER值>.table_x TO <当前查询用户名>;all_tables即可看到该表。
内容的提问来源于stack exchange,提问作者saluc
相关产品推荐
相关产品推荐

