Abrufen von "ORA-00942: Tabelle oder Ansicht existiert nicht", während Tabelle existiert

10

Ich bin ziemlich neu in der Oracle-Datenbank. Ich habe installiert Oracle Database 11g R2auf Oracle Linux 6. Ich habe erfolgreich eine neue Datenbank erstellt dbcaund eine Verbindung mit der Datenbank hergestellt, indem ich Folgendes verwendet habe:

$ sqlplus "/ as sysdba"

Ich habe erfolgreich eine Tabelle erstellt, einige Daten eingefügt und einige Auswahlen durchgeführt:

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

Dann habe ich einen neuen Benutzer mit dem Privileg CONNECT erstellt:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.

Dann habe ich eine neue Rolle mit entsprechenden Objektberechtigungen erstellt:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.

Und dem Benutzer die Rolle gewährt:

SQL> GRANT instructor TO teacher1;

Grant succeeded.

Als nächstes habe ich sqlplus mit beendet exit;und mich als neuer Benutzer verbunden, um es zu testen. Ich habe mich erfolgreich bei der Datenbank angemeldet mit:

$ 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>

Aber wenn ich versuche, aus der Tabelle auszuwählen, heißt es:

SQL> SELECT * FROM Instructors;
SELECT * FROM Instructors
              *
ERROR at line 1:
ORA-00942: table or view does not exist

Was fehlt mir hier ?!

Seyed Mohammad
quelle

Antworten:

19

Sie haben die Tabelle im SYSSchema erstellt (was Sie niemals tun sollten. Wirklich, niemals ).

Wenn Sie sich anmelden, teacher1sucht eine Anweisung nach Objekten in diesem Schema. Es gibt jedoch keine TEACHER1.INSTRUCTORSTabelle, da der wirkliche Name lautet SYS.INSTRUCTORS(habe ich erwähnt, was für eine schlechte Idee es ist, Objekte im SYS-Schema zu erstellen?).

Sie müssen ausgeführt werden select * from sys.instructors, um Zugriff auf diese Tabelle zu erhalten. Wenn Sie dem Tabellennamen nicht das Schema voranstellen möchten, erstellen Sie ein Synonym im teacher1Schema:

create synonym teacher1.instructors for sys.instructors;

Sie teacher1können dann über das SYSSchema auf die Tabelle zugreifen, ohne sie vollständig zu qualifizieren.

Nochmals: Verwenden Sie das SYS- oder SYSTEM-Konto nicht mehr für DBA-Inhalte. Verwenden Sie dafür ein reguläres Konto.

ein Pferd ohne Name
quelle
Vielen Dank. Ich muss Tabellen erstellen, auf die mehrere Benutzer zugreifen können. Aus Ihrer Erklärung schließe ich, dass ich einen neuen Benutzer erstellen sollte, z. B. dbadminmit DBABerechtigungen, und alle Tabellen mit diesem DBA-Benutzer erstellen sollte. Dann sollten alle anderen Benutzer über das DBADMINSchema auf die Tabellen zugreifen ... Richtig ?!
Seyed Mohammad
5
@SeyedMohammad: Es ist nicht erforderlich, einen DBA-Benutzer zu erstellen. Erstellen Sie einen regulären Benutzer und erstellen Sie die Tabellen in diesem Schema. Gewähren Sie dann den anderen Benutzern die Auswahl für diese Tabellen. Die Verwendung von DBA-Rollen für andere Zwecke als die DBA-Arbeit ist keine gute Idee.
a_horse_with_no_name