Obtendo “ORA-00942: tabela ou exibição não existe” enquanto a tabela existe

10

Sou bastante novo no banco de dados Oracle. Eu tenho instalado Oracle Database 11g R2no Oracle Linux 6. Criei com sucesso um novo banco de dados dbcae me conectei ao banco de dados usando:

$ sqlplus "/ as sysdba"

Criei com sucesso uma tabela e inseri alguns dados e realizei algumas seleções:

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

Então eu criei um novo usuário com o privilégio CONNECT:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.

Em seguida, criei uma nova função com privilégios de objeto apropriados:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.

E concedeu a função ao usuário:

SQL> GRANT instructor TO teacher1;

Grant succeeded.

Em seguida, saí do sqlplus com o exit;e conectado como o novo usuário para testá-lo. Entrei com sucesso no banco de dados com:

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

Mas quando tento selecionar da tabela, diz:

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

O que estou perdendo aqui ?!

Seyed Mohammad
fonte

Respostas:

19

Você criou a tabela no SYSesquema (que você nunca deve fazer. Realmente, nunca ).

Quando você efetua login, teacher1qualquer declaração procura objetos nesse esquema. Mas não há TEACHER1.INSTRUCTORStabela, porque o nome real é SYS.INSTRUCTORS(eu mencionei a ideia de criar objetos no esquema SYS?).

Você precisa executar select * from sys.instructorspara obter acesso a essa tabela. Se você não deseja prefixar o nome da tabela com o esquema, crie um sinônimo no teacher1esquema:

create synonym teacher1.instructors for sys.instructors;

Em seguida, teacher1pode acessar a tabela a partir do SYSesquema sem qualificá-la totalmente.

Novamente: pare de usar a conta SYS ou SYSTEM para qualquer coisa que não seja material do DBA. Use uma conta regular para isso.

um cavalo sem nome
fonte
Obrigado. Eu tenho que criar tabelas que vários usuários possam acessá-lo. Pela sua explicação, deduzo que devo criar um novo usuário, como dbadmincom DBAprivilégios, e criar todas as tabelas com esse usuário do DBA. Todos os outros usuários devem acessar as tabelas a partir do DBADMINesquema ... Correto ?!
Seyed Mohammad
5
@SeyedMohammad: Não há necessidade de criar um usuário DBA. Crie um usuário comum e crie as tabelas nesse esquema. Em seguida, conceda a seleção nessas tabelas aos outros usuários. Usar funções de DBA para qualquer coisa que não seja trabalho de DBA não é uma boa ideia.
a_horse_with_no_name