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

39

我使用SQL开发者工具,并使用系统用户连接到我的数据库,然后创建了一个新用户,并使用该用户进行了另一个连接,以获取所有需要的权限。

但是,当我尝试按照以下步骤操作时,出现了SQL错误:

ORA-00942表或视图不存在。


INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson')
7个回答

78

因为当搜索“ORA-00942:表或视图不存在插入”时,此帖子是在stackoverflow上找到的最顶部的帖子,我想提及另一个可能导致此错误的原因(至少在Oracle 12c中):一个表使用序列设置默认值,并且执行插入查询的用户没有序列的select权限。这是我的问题,并且我花费了不必要的长时间来弄清楚。

要复现该问题,请以user1的身份执行以下SQL语句:

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');

即使user2user1.customer表拥有插入和选择权限,并且正确地使用模式所有者名称作为前缀,结果仍将是“ORA-00942:表或视图不存在”。为避免此问题,您必须授予序列的选择权限:

grant select on seq_customer_id to user2;

16
刚经历了同样的情况。非常烦人,实际问题是序列权限问题,但会收到00942错误代码。 - SeattleDucati
2
你救了我的命,这个方法非常有效!Oracle对这个错误没有明确的说明。 - Carlos Jesus Arancibia Taborga

20

用户没有足够的权限查看该表,该表不存在或您正在错误的模式中运行查询

该表是否存在?

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

你授予了哪些特权?

    grant select, insert on customer to user;

您是否正在对第一个查询的所有者运行查询?


7
普通用户无法访问dba_objects,您应该使用all_objects代替。 - user330315
非常感谢您的关注,我已经执行了第一个查询以查看“customer”表的所有者,结果显示“选择了0行”。这意味着我创建的用户可能没有所需的权限,是吗? - Yurtsevero

15

区分大小写的表格(使用双引号创建的表格名称)也可能会引发相同的错误。有关更多信息,请参见此答案

只需将表格用双引号括起来即可:

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

11
你不能直接访问名称为customertable。要么应该使用user1.customer,要么为user2创建一个指向user1.customer的同义词customer。希望这能帮到你。

3
这里有一个答案:http://www.dba-oracle.com/concepts/synonyms.htm Oracle 同义词基本上允许你创建到某个其他地方存在的对象的指针。需要使用 Oracle 同义词,因为当你登录 Oracle 时,它会在你的模式(账户)中查找所有查询的对象。如果它们不存在,就会给你一个错误提示说它们不存在。

2

我正在使用Oracle数据库,遇到了同样的问题。最终我发现ORACLE DB将所有元数据(表/存储过程/视图/触发器)都转换成大写。

我曾尝试以sql中表名(myTempTable)的方式编写表名,但它要求按照数据库中存储表名的方式(MYTEMPTABLE)来输入。列名也是同样的情况。

对于那些曾经使用过sql,现在转向使用Oracle数据库的开发人员来说,这是一个相当普遍的问题。


0

在我的情况下,当我使用ASP.NET Core应用程序时,我的SQL查询中出现了一个错误。如果您的数据库包含许多模式,则必须在表名之前写入模式名称,例如: Select * from SCHEMA_NAME.TABLE_NAME... 希望这对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接