Отримання "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. Використовуйте звичайний рахунок для цього.


Дякую. Я повинен створити таблиці, щоб кілька користувачів могли отримати доступ до нього. З вашого пояснення я роблю висновок, що я повинен створити нового користувача, наприклад, dbadminз DBAпривілеями, і створити всі таблиці з цим користувачем DBA. Тоді всі інші користувачі повинні отримати доступ до таблиць зі DBADMINсхеми ... Правильно ?!
Відбувся Мохаммед

5
@SeyedMohammad: Не потрібно створювати користувача DBA. Створіть звичайного користувача та створіть таблиці в цій схемі. Потім надайте вибір на цих таблицях іншим користувачам. Використання ролей DBA для чогось іншого, ніж робота DBA - це не дуже гарна ідея.
a_horse_with_no_name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.