Obtenir «ORA-00942: la table ou la vue n'existe pas» alors que la table existe

10

Je suis relativement nouveau dans la base de données Oracle. J'ai installé Oracle Database 11g R2sur Oracle Linux 6. J'ai créé avec succès une nouvelle base de données avec dbcaet connecté à la base de données en utilisant:

$ sqlplus "/ as sysdba"

J'ai réussi à créer une table et à insérer des données et à effectuer des sélections:

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

J'ai ensuite créé un nouvel utilisateur avec le privilège CONNECT:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.

J'ai ensuite créé un nouveau rôle avec les privilèges d'objet appropriés:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.

Et accordé le rôle à l'utilisateur:

SQL> GRANT instructor TO teacher1;

Grant succeeded.

Ensuite, j'ai quitté sqlplus avec exit;et me suis connecté en tant que nouvel utilisateur pour le tester. Je me suis connecté avec succès à la base de données avec:

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

Mais quand j'essaie de sélectionner dans le tableau, il dit:

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

Qu'est-ce qui me manque ici?!

Seyed Mohammad
la source

Réponses:

19

Vous avez créé la table dans le SYSschéma (ce que vous ne devriez jamais , jamais faire. Vraiment, jamais ).

Lorsque vous vous connectez, teacher1toute instruction recherche des objets dans ce schéma. Mais il n'y a pas de TEACHER1.INSTRUCTORStable, car le vrai nom est SYS.INSTRUCTORS(ai-je mentionné quelle mauvaise idée de créer des objets dans le schéma SYS?).

Vous devez exécuter select * from sys.instructorspour accéder à cette table. Si vous ne voulez pas préfixer le nom de la table avec le schéma, créez un synonyme dans le teacher1schéma:

create synonym teacher1.instructors for sys.instructors;

Vous teacher1pouvez ensuite accéder à la table à partir du SYSschéma sans la qualifier entièrement.

Encore une fois: arrêtez d'utiliser le compte SYS ou SYSTEM pour tout ce qui n'est pas du matériel DBA. Utilisez un compte régulier pour cela.

un cheval sans nom
la source
Merci. Je dois créer des tables auxquelles plusieurs utilisateurs pourraient y accéder. D'après votre explication, j'en déduis que je dois créer un nouvel utilisateur, comme dbadminavec des DBAprivilèges, et créer toutes les tables avec cet utilisateur DBA. Ensuite, tous les autres utilisateurs devraient accéder aux tables à partir du DBADMINschéma ... Correct?!
Seyed Mohammad
5
@SeyedMohammad: Pas besoin de créer un utilisateur DBA. Créez un utilisateur normal et créez les tables dans ce schéma. Accordez ensuite la sélection sur ces tables aux autres utilisateurs. L'utilisation de rôles DBA pour autre chose que le travail DBA n'est pas une bonne idée.
a_horse_with_no_name