【问题标题】:SQL Error: ORA-00942 table or view does not existSQL 错误:ORA-00942 表或视图不存在
【发布时间】:2013-04-14 08:09:19
【问题描述】:

我使用 SQL 开发人员并与系统用户建立了与我的数据库的连接,之后我创建了一个用户并以所有需要的权限与该用户建立了另一个连接。

但是当我尝试继续执行时,我得到了 SQL 错误

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


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

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    因为这篇文章是在 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;
    

    【讨论】:

    • 刚刚经历了同样的场景。当实际问题是序列权限问题时,您得到 00942 非常令人恼火。
    • 非常感谢@jake stayman 的提及。我刚刚经历了这个,浪费了一天的时间来调试这个..
    • 非常感谢!完全拯救了我的一天!查了很久的数据库变更日志,没想到是权限造成的。
    • 但我没有看到该表的任何序列。啊对。 :)
    【解决方案2】:

    用户没有查看表所需的权限、表不存在或您在错误的架构中运行查询

    表存在吗?

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

    您授予了哪些权限?

        grant select, insert on customer to user;
    

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

    【讨论】:

    • 普通用户无法访问 dba_objects。您应该改用all_objects
    • 非常感谢您的关注,我执行了第一个查询以查看“客户”表的所有者,结果“选择了 0 行”。所以这意味着我创建的用户不需要我猜的权限?
    【解决方案3】:

    区分大小写的表(用双引号创建的表名)也可能引发同样的错误。 See this answer 了解更多信息。

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

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

    【讨论】:

    • 这是唯一对我有用的答案 - 谢谢!
    • 它对我有用。表是用双引号创建的,并且在查询中添加引号是有效的。
    【解决方案4】:

    您不能直接访问名为“客户”的表。它应该是“user1.customer”,或者为指向“user1.customer”的 user2 创建同义词“customer”。希望这会有所帮助..

    【讨论】:

      【解决方案5】:

      这是一个答案:http://www.dba-oracle.com/concepts/synonyms.htm

      Oracle 同义词基本上允许您创建指向存在于其他地方的对象的指针。您需要 Oracle 同义词,因为当您登录 Oracle 时,它​​会在您的模式(帐户)中查找您正在查询的所有对象。如果它们不存在,它会给你一个错误,告诉你它们不存在。

      【讨论】:

      【解决方案6】:

      我正在使用 Oracle 数据库,我遇到了同样的问题。最终我发现 ORACLE DB 正在将所有元数据(表/sp/view/trigger)转换为大写。

      我正在尝试如何在 sql 中编写表名 (myTempTable),而它期望它如何将表名存储在数据库 (MYTEMPTABLE) 中。也同样适用于列名。

      对于使用 sql 并现在跳入 ORACLE DB 的开发人员来说,这是一个很常见的问题。

      【讨论】:

        【解决方案7】:

        就我而言,当我使用 asp.net 核心应用程序时,我的 sql 查询出现了错误。如果您的数据库包含许多模式,则必须在 table_name 之前编写 schema_name,例如: 从 SCHEMA_NAME.TABLE_NAME 中选择 *... 我希望它会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-06
          • 1970-01-01
          • 2019-01-22
          • 2019-09-29
          • 2012-04-23
          • 2015-11-09
          相关资源
          最近更新 更多