【发布时间】:2013-04-14 08:09:19
【问题描述】:
我使用 SQL 开发人员并与系统用户建立了与我的数据库的连接,之后我创建了一个用户并以所有需要的权限与该用户建立了另一个连接。
但是当我尝试继续执行时,我得到了 SQL 错误
ORA-00942 表或视图不存在。:
INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson')
【问题讨论】:
我使用 SQL 开发人员并与系统用户建立了与我的数据库的连接,之后我创建了一个用户并以所有需要的权限与该用户建立了另一个连接。
但是当我尝试继续执行时,我得到了 SQL 错误
ORA-00942 表或视图不存在。:
INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson')
【问题讨论】:
因为这篇文章是在 stackoverflow 上搜索“ORA-00942:表或视图不存在插入”时找到的最上面的一篇,所以我想提一下这个错误的另一个可能原因(至少在 Oracle 12c 中):一个表使用序列来设置默认值,并且执行插入查询的用户对序列没有选择权限。这是我的问题,我花了很长时间才弄明白。
要重现问题,请以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');
结果将是“ORA-00942:表或视图不存在”,即使 user2 确实对 user1.customer 表具有插入和选择权限,并且正确地为表添加了架构所有者名称的前缀。为避免此问题,您必须授予对序列的选择权限:
grant select on seq_customer_id to user2;
【讨论】:
用户没有查看表所需的权限、表不存在或您在错误的架构中运行查询
表存在吗?
select owner,
object_name
from dba_objects
where object_name = any ('CUSTOMER','customer');
您授予了哪些权限?
grant select, insert on customer to user;
您是否对第一个查询中的所有者运行查询?
【讨论】:
dba_objects。您应该改用all_objects。
区分大小写的表(用双引号创建的表名)也可能引发同样的错误。 See this answer 了解更多信息。
只需将表格用双引号括起来:
INSERT INTO "customer" (c_id,name,surname) VALUES ('1','Micheal','Jackson')
【讨论】:
您不能直接访问名为“客户”的表。它应该是“user1.customer”,或者为指向“user1.customer”的 user2 创建同义词“customer”。希望这会有所帮助..
【讨论】:
这是一个答案:http://www.dba-oracle.com/concepts/synonyms.htm
Oracle 同义词基本上允许您创建指向存在于其他地方的对象的指针。您需要 Oracle 同义词,因为当您登录 Oracle 时,它会在您的模式(帐户)中查找您正在查询的所有对象。如果它们不存在,它会给你一个错误,告诉你它们不存在。
【讨论】:
我正在使用 Oracle 数据库,我遇到了同样的问题。最终我发现 ORACLE DB 正在将所有元数据(表/sp/view/trigger)转换为大写。
我正在尝试如何在 sql 中编写表名 (myTempTable),而它期望它如何将表名存储在数据库 (MYTEMPTABLE) 中。也同样适用于列名。
对于使用 sql 并现在跳入 ORACLE DB 的开发人员来说,这是一个很常见的问题。
【讨论】:
就我而言,当我使用 asp.net 核心应用程序时,我的 sql 查询出现了错误。如果您的数据库包含许多模式,则必须在 table_name 之前编写 schema_name,例如: 从 SCHEMA_NAME.TABLE_NAME 中选择 *... 我希望它会有所帮助。
【讨论】: