Obteniendo "ORA-00942: la tabla o vista no existe" mientras la tabla existe

10

Soy bastante nuevo en la base de datos Oracle. Lo he instalado Oracle Database 11g R2en Oracle Linux 6. He creado con éxito una nueva base de datos con dbcay conectado a la base de datos usando:

$ sqlplus "/ as sysdba"

Creé con éxito una tabla e inserté algunos datos y realicé algunas selecciones:

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

Luego creé un nuevo usuario con el privilegio CONNECT:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.

Luego creé un nuevo rol con los privilegios de objeto apropiados:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.

Y le otorgó el rol al usuario:

SQL> GRANT instructor TO teacher1;

Grant succeeded.

A continuación, salí de sqlplus exit;y me conecté como el nuevo usuario para probarlo. Me conecté exitosamente a la base de datos 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>

Pero cuando trato de seleccionar de la tabla dice:

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

¿Qué me estoy perdiendo aquí?

Seyed Mohammad
fuente

Respuestas:

19

Usted creó la tabla en el SYSesquema (que nunca debe hacer. Realmente, nunca ).

Cuando inicia sesión como teacher1cualquier instrucción busca objetos en ese esquema. Pero no hay una TEACHER1.INSTRUCTORStabla, porque el nombre real es SYS.INSTRUCTORS(¿mencioné qué mala idea es crear objetos en el esquema SYS?).

Debe ejecutar select * from sys.instructorspara obtener acceso a esa tabla. Si no desea anteponer el nombre de la tabla con el esquema, cree un sinónimo en el teacher1esquema:

create synonym teacher1.instructors for sys.instructors;

Luego teacher1puede acceder a la tabla desde el SYSesquema sin calificarlo completamente.

Nuevamente: deje de usar la cuenta SYS o SYSTEM para cualquier cosa que no sea material DBA. Use una cuenta regular para eso.

un caballo sin nombre
fuente
Gracias. Tengo que crear tablas a las que puedan acceder múltiples usuarios. A partir de su explicación, infiero que debería crear un nuevo usuario, como dbadmincon DBAprivilegios, y crear todas las tablas con este usuario de DBA. Entonces todos los demás usuarios deberían acceder a las tablas desde el DBADMINesquema ... ¿Correcto?
Seyed Mohammad
55
@SeyedMohammad: No es necesario crear un usuario de DBA. Cree un usuario normal y cree las tablas en ese esquema. Luego otorgue selección en esas tablas a los otros usuarios. Usar roles de DBA para cualquier otra cosa que no sea el trabajo de DBA no es una buena idea.
a_horse_with_no_name