我使用SQL开发人员,在创建用户并与该用户建立了具有所有必需权限的另一个连接后,我与系统用户建立了数据库连接。
但是当我尝试继续下面时,我得到了SQL错误
ORA-00942表或视图不存在。:
INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson')
答案 0 :(得分:25)
因为在搜索“ORA-00942:表或视图不存在插入”时,此帖子是stackoverflow上发现的最高帖子,我想提及此错误的另一个可能原因(至少在Oracle 12c中):表格使用序列设置默认值,执行插入查询的用户对序列没有select权限。这是我的问题,我花了不必要的时间来弄明白。
要重现此问题,请执行以下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;
然后,将此insert语句作为user2
执行:
insert into user1.customer (name,surname) values ('michael','jackson');
结果将是“ORA-00942:表或视图不存在”,即使user2
在user1.customer
表上具有插入和选择权限,并且正确地为表添加了架构所有者名称前缀。要避免此问题,您必须为序列授予select权限:
grant select on seq_customer_id to user2;
答案 1 :(得分:11)
用户没有查看表所需的权限,表不存在或者您在错误的架构中运行查询
表格存在吗?
select owner,
object_name
from dba_objects
where object_name = any ('CUSTOMER','customer');
你授予了哪些特权?
grant select, insert on customer to user;
您是从第一个查询中针对所有者运行查询吗?
答案 2 :(得分:6)
您无法直接访问名为“customer”的表格。它应该是'user1.customer'或为user2指向'user1.customer'创建同义词'customer'。希望这会有所帮助..
答案 3 :(得分:1)
以下是答案:http://www.dba-oracle.com/concepts/synonyms.htm
Oracle同义词基本上允许您创建指向其他位置的对象的指针。您需要Oracle同义词,因为当您登录Oracle时,它会查找您在架构(帐户)中查询的所有对象。如果它们不在那里,它会给你一个错误,告诉你它们不存在。
答案 4 :(得分:0)
区分大小写的表(使用双引号创建的表名)也可能引发此相同错误。 See this answer以获得更多信息。
只需将表格用双引号引起来:
INSERT INTO "customer" (c_id,name,surname) VALUES ('1','Micheal','Jackson')
答案 5 :(得分:0)
我正在使用Oracle数据库,但遇到了同样的问题。最终我发现ORACLE DB正在转换所有大写的元数据(表/ sp /视图/触发器)。
并且我正在尝试如何在sql中编写表名(myTempTable),但是它期望如何在databsae(MYTEMPTABLE)中存储表名。同样适用于列名。
无论是使用sql还是现在跳入ORACLE DB的开发人员,这都是一个非常普遍的问题。