SQL错误:ORA-00942表或视图不存在

问题描述:

我使用SQL开发人员,并且在创建用户并与具有所有必需特权的该用户建立了另一个连接之后,我与系统用户建立了连接。SQL错误:ORA-00942表或视图不存在

但是当我尝试进行以下我得到的SQL错误

ORA-00942 table or view does not exist.:


INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson') 

无论是用户没有看表所需的权限,该表不存在或您正在错误的模式下运行查询

该表是否存在?

select owner, 
     object_name 
from dba_objects 
where object_name = any ('CUSTOMER','customer'); 

您授予了什么特权?

grant select, insert on customer to user; 

您是否从第一个查询针对所有者运行查询?

+4

'dba_objects'不能被普通用户访问。您应该使用'all_objects'。 – 2013-04-21 10:30:43

+0

非常感谢您的关注,Ive执行了第一个查询以查看“客户”表的所有者,我得到了结果“0 rows selected”。 这意味着我创建的用户没有我想要的特权? – user2304042 2013-04-23 09:05:16

您不能直接访问名为'customer'的表。要么它应该是'user1.customer',要么为user2创建一个指向'user1.customer'的同义词'customer'。希望这有助于..

这里有一个答案:http://www.dba-oracle.com/concepts/synonyms.htm

一个Oracle同义词基本上可以让你创建一个指向存在别的地方的对象。您需要Oracle同义词,因为当您登录到Oracle时,它会查找您在架构(帐户)中查询的所有对象。如果他们不在那里,它会给你一个错误,告诉你他们不存在。

因为这篇文章是在搜索“ORA-00942:表或视图不存在插入”时在stackoverflow上发现的第一个帖子,所以我想提及此错误的另一个可能原因(至少在Oracle 12c中):a表使用序列来设置默认值,执行插入查询的用户对序列没有选择权限。这是我的问题,我花了不必要的时间来弄清楚。

要重现该问题,执行下面的SQL作为user1

create sequence seq_customer_id; 

create table customer (
c_id number(10) default seq_customer_id.nextval primary key, 
name varchar(100) not null, 
surname varchar(100) not null 
); 

grant select, insert, update, delete on customer to user2; 

然后,执行此插入语句为user2

insert into user1.customer (name,surname) values ('michael','jackson'); 

其结果将是“ORA-00942:表或视图不存在“,即使user2确实在user1.customer表上插入并选择了特权,并且正确地为该表添加了架构所有者名称的前缀。为了避免该问题,您必须授予该序列的选择特权:

grant select on seq_customer_id to user2; 
+0

刚刚经历了同样的情况。当实际问题出现序列许可问题时,非常恼人的是你得到了00942。 – SeattleDucati 2017-08-29 14:03:00