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?

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.