Uzyskiwanie „ORA-00942: tabela lub widok nie istnieje”, podczas gdy tabela istnieje

10

Jestem dość nowy w bazie danych Oracle. Zainstalowałem Oracle Database 11g R2na Oracle Linux 6. Pomyślnie utworzyłem nową bazę danych dbcai nawiązałem z nią połączenie, używając:

$ sqlplus "/ as sysdba"

Pomyślnie utworzyłem tabelę, wstawiłem niektóre dane i wykonałem kilka wyborów:

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

Następnie utworzyłem nowego użytkownika z uprawnieniem CONNECT:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.

Następnie utworzyłem nową rolę z odpowiednimi uprawnieniami do obiektów:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.

I przyznał rolę użytkownikowi:

SQL> GRANT instructor TO teacher1;

Grant succeeded.

Następnie opuściłem sqlplus exit;i podłączyłem się jako nowy użytkownik, aby go przetestować. Zalogowałem się do bazy danych za pomocą:

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

Ale kiedy próbuję wybrać z tabeli, mówi:

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

Czego tu brakuje?

Seyed Mohammad
źródło

Odpowiedzi:

19

Utworzyłeś tabelę w SYSschemacie (czego nigdy nie powinieneś robić. Naprawdę, nigdy ).

Gdy logujesz się, ponieważ teacher1dowolna instrukcja szuka obiektów w tym schemacie. Ale nie ma TEACHER1.INSTRUCTORStabeli, ponieważ prawdziwa nazwa to SYS.INSTRUCTORS(czy wspominałem, jak złym pomysłem jest tworzenie obiektów w schemacie SYS?).

Musisz uruchomić, select * from sys.instructorsaby uzyskać dostęp do tego stołu. Jeśli nie chcesz poprzedzać nazwy tabeli schematem, utwórz synonim w teacher1schemacie:

create synonym teacher1.instructors for sys.instructors;

Następnie teacher1może uzyskać dostęp do tabeli ze SYSschematu bez pełnego kwalifikowania go.

Znowu: przestań używać konta SYS lub SYSTEM do wszystkiego, co nie jest DBA. Użyj do tego zwykłego konta.

koń bez imienia
źródło
Dzięki. Muszę utworzyć tabele, do których wielu użytkowników może uzyskać dostęp. Z twojego wyjaśnienia wnioskuję, że powinienem utworzyć nowego użytkownika, na przykład dbadminz DBAuprawnieniami, i utworzyć wszystkie tabele z tym użytkownikiem DBA. Następnie wszyscy inni użytkownicy powinni uzyskać dostęp do tabel ze DBADMINschematu ... Prawidłowo?!
Seyed Mohammad
5
@SeyedMohammad: Nie ma potrzeby tworzenia użytkownika DBA. Utwórz zwykłego użytkownika i utwórz tabele w tym schemacie. Następnie udziel zaznaczenie na tych tabelach innym użytkownikom. Używanie ról DBA do celów innych niż praca DBA nie jest dobrym pomysłem.
a_horse_with_no_name