Ottenere “ORA-00942: la tabella o la vista non esiste” mentre la tabella esiste


10

Sono abbastanza nuovo nel database Oracle. Ho installato Oracle Database 11g R2su Oracle Linux 6. Ho creato con successo un nuovo database dbcae connesso al database usando:

$ sqlplus "/ as sysdba"

Ho creato con successo una tabella e inserito alcuni dati ed eseguito alcune selezioni:

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

Quindi ho creato un nuovo utente con il privilegio CONNECT:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.

Quindi ho creato un nuovo ruolo con i privilegi di oggetto appropriati:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.

E concesso il ruolo all'utente:

SQL> GRANT instructor TO teacher1;

Grant succeeded.

Successivamente sono uscito da sqlplus exit;e mi sono connesso come nuovo utente per testarlo. Ho effettuato correttamente l'accesso al database con:

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

Ma quando provo a selezionare dalla tabella si dice:

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

Cosa mi manca qui ?!

Risposte:


19

Hai creato la tabella nello SYSschema (cosa che non dovresti mai , mai. Davvero, mai ).

Quando si accede come teacher1qualsiasi istruzione cerca oggetti in quello schema. Ma non esiste una TEACHER1.INSTRUCTORStabella, perché il vero nome è SYS.INSTRUCTORS(ho già detto che è una cattiva idea creare oggetti nello schema SYS?).

Devi eseguire select * from sys.instructorsper accedere a quella tabella. Se non si desidera aggiungere il prefisso al nome della tabella con lo schema, creare un sinonimo nello teacher1schema:

create synonym teacher1.instructors for sys.instructors;

Quindi teacher1può accedere alla tabella dallo SYSschema senza qualificarla completamente.

Ancora: smetti di usare l'account SYS o SYSTEM per tutto ciò che non è roba DBA. Usa un account normale per questo.


Grazie. Devo creare tabelle a cui più utenti possano accedervi. Dalla tua spiegazione, deduco che dovrei creare un nuovo utente come dbadmincon i DBAprivilegi e creare tutte le tabelle con questo utente DBA. Quindi tutti gli altri utenti dovrebbero accedere alle tabelle dallo DBADMINschema ... Corretto ?!
Seyed Mohammad,

5
@SeyedMohammad: non è necessario creare un utente DBA. Crea un utente normale e crea le tabelle in quello schema. Quindi concedi la selezione su quelle tabelle agli altri utenti. L'uso di ruoli DBA per qualcos'altro che il lavoro DBA non è una buona idea.
a_horse_with_no_name
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.