我使用 SQL 开发人员并与系统用户建立了一个连接,在我创建了一个用户并与该用户建立了另一个具有所有所需权限的连接之后。
但是当我尝试继续执行时,我得到了 SQL 错误
ORA-00942 表或视图不存在。:
INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson')
因为这篇文章是在 stackoverflow 上搜索“ORA-00942: table or view does not exist insert”时发现的最上面的帖子,所以我想提一下这个错误的另一个可能原因(至少在 Oracle 12c 中):a table uses a sequence设置默认值并且执行插入查询的用户对序列没有选择权限。这是我的问题,我花了不必要的时间才弄明白。
要重现该问题,请执行以下 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;
用户没有查看表所需的权限,表不存在,或者您在错误的模式中运行查询
表存在吗?
select owner,
object_name
from dba_objects
where object_name = any ('CUSTOMER','customer');
你授予了什么特权?
grant select, insert on customer to user;
您是否从第一个查询中针对所有者运行查询?
区分大小写的表(使用双引号创建的表名)也可能引发同样的错误。有关更多信息,请参阅此答案。
只需将表格用双引号括起来:
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 core 应用程序时,我的 sql 查询出错了。如果您的数据库包含许多模式,则必须在 table_name 之前编写 schema_name,例如: Select * from SCHEMA_NAME.TABLE_NAME... 我希望它会有所帮助。