表确实存在时出现“ORA-00942:表或视图不存在”

Sey*_*mad 10 oracle oracle-11g-r2 errors

我对 Oracle 数据库相当陌生。我已经安装Oracle Database 11g R2Oracle Linux 6. 我已经成功创建了一个新数据库dbca并使用以下方法连接到数据库:

$ sqlplus "/ as sysdba"
Run Code Online (Sandbox Code Playgroud)

我成功创建了一个表并插入了一些数据并执行了一些选择:

SQL> CREATE TABLE Instructors (
         tid    NUMBER(7) PRIMARY KEY,
         fname  VARCHAR2(32),
         lname  VARCHAR2(32),
         tel    NUMBER(16),
         adrs   VARCHAR2(128) );

Table created.

SQL> INSERT INTO Instructors (tid, fname, lname, tel, adrs)
     VALUES (8431001, 'John', 'Smith', 654321, 'London');

1 row created.

SQL> SELECT count(*) FROM Instructors;

  COUNT(*)
----------
        1
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个具有 CONNECT 权限的新用户:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个具有适当对象权限的新角色:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.
Run Code Online (Sandbox Code Playgroud)

并将角色授予用户:

SQL> GRANT instructor TO teacher1;

Grant succeeded.
Run Code Online (Sandbox Code Playgroud)

接下来我退出 sqlplusexit;并以新用户身份连接以测试它。我成功登录到数据库:

$ sqlplus teacher1

SQL*Plus: Release 11.2.0.1.0 Production on Thu Jul 25 03:20:50 2013
Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Enter password: *****

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从表中选择时,它说:

SQL> SELECT * FROM Instructors;
SELECT * FROM Instructors
              *
ERROR at line 1:
ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?!

a_h*_*ame 19

您在创建表SYS的模式(你应该永远,永远做。真的,从来没有)。

当您以teacher1任何语句登录时,会在该模式中查找对象。但是没有TEACHER1.INSTRUCTORS表,因为真正的名字是SYS.INSTRUCTORS(我有没有提到在 SYS 模式中创建对象是一个多么糟糕的主意?)。

您需要运行select * from sys.instructors才能访问该表。如果不想在表名前面加上架构,请在架构中创建同义词teacher1

create synonym teacher1.instructors for sys.instructors;
Run Code Online (Sandbox Code Playgroud)

然后teacher1可以从SYS架构访问该表,而无需对其进行完全限定。

再次:停止使用 SYS 或 SYSTEM 帐户来处理非 DBA 内容。为此使用常规帐户。

  • @SeyedMohammad:无需创建 DBA 用户。创建一个普通用户并在该模式中创建表。然后将这些表上的选择授予其他用户。将 DBA 角色用于 DBA 工作以外的任何事情都不是一个好主意。 (5认同)