如何在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 中为用户 + 表名组合使用带引号的标识符?
如何在recyclerview(FirebaseRecyclerOptions)中为特定用户显示所有孩子