如何在oracle中为特定用户查询没有所有者名称的表名

Posted

技术标签:

【中文标题】如何在oracle中为特定用户查询没有所有者名称的表名【英文标题】:How to query table name without owner name for a specific user in oracle 【发布时间】:2020-11-18 03:45:33 【问题描述】:

在 Oracle19c 中,我使用 SYS 用户创建了表,因此表的所有者名称为“SYS”。然后我创建了一个新用户并将所有权限授予该用户。然后用那个新创建的用户登录,查询

Select * from tblname

但是

ORA-00942: 表或视图不存在

发现错误但可以查询

Select * from SYS.tblname

有没有办法从其他用户那里查询没有所有者名称的表名?

【问题讨论】:

【参考方案1】:

有没有办法从其他用户那里查询没有所有者名称的表名?

当然有。为该表创建一个同义词,可以是私有的(属于您的架构)或公共的(任何人都可以访问)。

例如:连接为SCOTT,我正在创建一个表并将SELECT权限授予用户MIKE

SQL> show user
USER is "SCOTT"
SQL> create table scott_table as
  2  select 'Littlefoot' name from dual;

Table created.

SQL> grant select on scott_table to mike;

Grant succeeded.

MIKE 连接并尝试从该表中选择:不指定所有者名称,它将不起作用:

SQL> connect mike/lion
Connected.
SQL> select * from scott_table;
select * from scott_table
              *
ERROR at line 1:
ORA-00942: table or view does not exist

如果我在表名之前加上所有者的名字,它会起作用(但你想避免它):

SQL> select * from scott.scott_table;

NAME
----------
Littlefoot

所以,创建一个同义词:

SQL> create synonym scott_table for scott.scott_table;

Synonym created.

SQL> select * from scott_table;

NAME
----------
Littlefoot

SQL>

然而:你所做的是一个巨大的错误。永远不要与SYS 用户搞砸。 SYS 很特别。它拥有数据库。建议完全不要使用它——创建您自己的用户,该用户将执行“系统相关”任务并授予它DBA 角色。仅当其他用户无法做到时才使用SYS。在 SYS 架构中创建自己的表是您应该避免的。

因为SYS 很特别,您可以“忘记”您以SYS 连接,做一些您不打算做的事情并破坏您的数据库。

因此,我建议您不要这样做。在其他地方,在其他架构中创建该表,然后练习 同义词 和其他东西。

【讨论】:

以上是关于如何在oracle中为特定用户查询没有所有者名称的表名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中为用户 + 表名组合使用带引号的标识符?

如何在 Oracle 中为所有用户和权限生成 DDL

如何在recyclerview(FirebaseRecyclerOptions)中为特定用户显示所有孩子

oracle如何查询一个用户下的所有分区表?求脚本

如何在 Jackson 中为特定类配置 setter 和 getter 名称约定?

在 SQL Server 2008 R2 中为特定数据库用户设置最大查询数