我使用SQL开发者工具,并使用系统用户连接到我的数据库,然后创建了一个新用户,并使用该用户进行了另一个连接,以获取所有需要的权限。
但是,当我尝试按照以下步骤操作时,出现了SQL错误:
ORA-00942表或视图不存在。
INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson')
因为当搜索“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');
即使user2
对user1.customer
表拥有插入和选择权限,并且正确地使用模式所有者名称作为前缀,结果仍将是“ORA-00942:表或视图不存在”。为避免此问题,您必须授予序列的选择权限:
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
代替。 - user330315区分大小写的表格(使用双引号创建的表格名称)也可能会引发相同的错误。有关更多信息,请参见此答案。
只需将表格用双引号括起来即可:
INSERT INTO "customer" (c_id,name,surname) VALUES ('1','Micheal','Jackson')
customer
的table
。要么应该使用user1.customer
,要么为user2创建一个指向user1.customer
的同义词customer
。希望这能帮到你。我正在使用Oracle数据库,遇到了同样的问题。最终我发现ORACLE DB将所有元数据(表/存储过程/视图/触发器)都转换成大写。
我曾尝试以sql中表名(myTempTable)的方式编写表名,但它要求按照数据库中存储表名的方式(MYTEMPTABLE)来输入。列名也是同样的情况。
对于那些曾经使用过sql,现在转向使用Oracle数据库的开发人员来说,这是一个相当普遍的问题。
在我的情况下,当我使用ASP.NET Core应用程序时,我的SQL查询中出现了一个错误。如果您的数据库包含许多模式,则必须在表名之前写入模式名称,例如: Select * from SCHEMA_NAME.TABLE_NAME... 希望这对您有所帮助。