Получение «ORA-00942: таблица или представление не существует», в то время как таблица существует

10

Я довольно новичок в базе данных Oracle. Я установил Oracle Database 11g R2на Oracle Linux 6. Я успешно создал новую базу данных dbcaи подключился к ней, используя:

$ sqlplus "/ as sysdba"

Я успешно создал таблицу, вставил некоторые данные и выполнил некоторые операции выбора:

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

Затем я создал нового пользователя с привилегией CONNECT:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.

Затем я создал новую роль с соответствующими привилегиями объекта:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.

И предоставил роль пользователю:

SQL> GRANT instructor TO teacher1;

Grant succeeded.

Затем я вышел из sqlplus exit;и подключился как новый пользователь, чтобы проверить его. Я успешно вошел в базу данных с:

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

Но когда я пытаюсь выбрать из таблицы, он говорит:

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

Что мне здесь не хватает ?!

Сейед Мухаммед
источник

Ответы:

19

Вы создали таблицу в SYSсхеме (что вы никогда не должны делать никогда. Действительно, никогда ).

Когда вы входите в систему, teacher1любой оператор ищет объекты в этой схеме. Но TEACHER1.INSTRUCTORSтаблицы нет , потому что настоящее имя SYS.INSTRUCTORS(я упоминал, что плохая идея создавать объекты в схеме SYS?).

Вам нужно запустить, select * from sys.instructorsчтобы получить доступ к этой таблице. Если вы не хотите добавлять префикс имени таблицы к схеме, создайте синоним в teacher1схеме:

create synonym teacher1.instructors for sys.instructors;

Затем teacher1можно получить доступ к таблице из SYSсхемы без полной ее квалификации.

Снова: прекратите использовать учетную запись SYS или SYSTEM для всего, что не является компонентом DBA. Для этого используйте обычный аккаунт.

a_horse_with_no_name
источник
Спасибо. Я должен создать таблицы, чтобы несколько пользователей могли получить к нему доступ. Из вашего объяснения я делаю вывод, что я должен создать нового пользователя, такого как dbadminс DBAпривилегиями, и создать все таблицы с этим пользователем DBA. Тогда все остальные пользователи должны получить доступ к таблицам из DBADMINсхемы ... Правильно ?!
Сейед Мохаммед
5
@SeyedMohammad: не нужно создавать пользователя DBA. Создайте обычного пользователя и создайте таблицы в этой схеме. Затем предоставьте выбор на этих таблицах другим пользователям. Использование ролей DBA для чего-то еще, кроме работы DBA, не очень хорошая идея.
a_horse_with_no_name