首页 文章

获取ORA-01031:查询表而不是ORA-00942时权限不足:表或视图不存在

提问于
浏览
10

当我'm querying a table in schema C from schema A, I'得到 ORA-01031: insufficient privileges 而当我'm querying the same table from schema B, I'得到 ORA-00942: table or view does not exist . 在表上,两个模式都没有任何特权 . 在这种情况下,为什么我会收到不同的错误消息?

3 回答

  • 1

    如果表上至少有一个权限,则可能得到 ORA-01031: insufficient privileges 而不是 ORA-00942: table or view does not exist ,但不是必需的权限 .

    Create schemas

    SQL> create user schemaA identified by schemaA;
    
    User created.
    
    SQL> create user schemaB identified by schemaB;
    
    User created.
    
    SQL> create user test_user identified by test_user;
    
    User created.
    
    SQL> grant connect to test_user;
    
    Grant succeeded.
    

    Create objects and privileges

    在不授予SELECT的情况下授予模式DELETE等特权是不寻常的,但也是可能的 .

    SQL> create table schemaA.table1(a number);
    
    Table created.
    
    SQL> create table schemaB.table2(a number);
    
    Table created.
    
    SQL> grant delete on schemaB.table2 to test_user;
    
    Grant succeeded.
    

    Connect as TEST_USER and try to query the tables

    这表明在表上拥有一些权限会更改错误消息 .

    SQL> select * from schemaA.table1;
    select * from schemaA.table1
                          *
    ERROR at line 1:
    ORA-00942: table or view does not exist
    
    
    SQL> select * from schemaB.table2;
    select * from schemaB.table2
                          *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    
    
    SQL>
    
  • 7

    当对象存在于模式中但没有对该对象的任何访问权时,会发生 ORA-01031: insufficient privileges .

    ORA-00942: table or view does not exist 在当前架构中不存在该对象时发生 . 如果对象存在于另一个模式中,则需要使用它来访问它 . 如果所有者未授予对调用模式的访问权限,则仍然可能会获得不足的权限错误 .

  • 1

    对于ORA-01031:权限不足 . 一些更常见的原因是:

    • 您试图在没有相应权限的情况下更改Oracle用户名或密码 .

    • 您试图对表执行 UPDATE ,但您只能对表执行 SELECT .

    • 您尝试使用 CONNECT INTERNAL 启动Oracle数据库 .

    • 您试图在没有适当的操作系统权限的情况下安装Oracle数据库 .

    解决此Oracle错误的选项是:

    • 您可以让Oracle DBA授予您缺少的相应权限 .

    • 您可以让Oracle DBA为您执行操作 .

    • 如果您在启动Oracle时遇到问题,则可能需要将Oracle用户添加到dba组 .

    对于 ORA-00942: table or view does not exist. 您试图执行一个SQL语句,该语句引用一个表或视图,该表或视图不存在,您无权访问或属于另一个模式,并且您没有通过模式名称引用该表 .

    如果由于表或视图不存在而发生此错误,则需要创建表或视图 .

    您可以通过执行以下SQL语句来检查Oracle中是否存在该表:

    select *
    from all_objects
    where object_type in ('TABLE','VIEW')
    and object_name = 'OBJECT_NAME';
    

    例如,如果您正在寻找供应商表,您将执行:

    select *
    from all_objects
    where object_type in ('TABLE','VIEW')
    and object_name = 'SUPPLIERS';
    

    选项#2

    如果由于您无权访问表或视图而发生此错误,则需要拥有表/视图的所有者,或者DBA授予您对此对象的适当权限 .

    选项#3

    如果发生此错误是因为表/视图属于另一个模式,并且您没有通过模式名称引用该表,则需要重写SQL以包含模式名称 .

    例如,您可能已执行以下SQL语句:

    select *
    from suppliers;
    

    suppliers 表不归您所有,而是由一个名为app的模式所拥有,您可以按如下方式修复SQL:

    select *
    from app.suppliers;
    

    如果您不知道供应商表/视图所属的模式,则可以执行以下SQL来查找:

    select owner
    from all_objects
    where object_type in ('TABLE','VIEW')
    and object_name = 'SUPPLIERS';
    

    这将返回拥有供应商表的架构名称 .

相关问题