Mendapatkan "ORA-00942: tabel atau tampilan tidak ada" sementara tabel memang ada

10

Saya cukup baru di database Oracle. Saya telah menginstal Oracle Database 11g R2di Oracle Linux 6. Saya telah berhasil membuat database baru dengan dbcadan terhubung ke database menggunakan:

$ sqlplus "/ as sysdba"

Saya berhasil membuat tabel dan memasukkan beberapa data dan melakukan beberapa pemilihan:

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

Lalu saya membuat pengguna baru dengan hak istimewa CONNECT:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.

Lalu saya membuat peran baru dengan hak objek yang sesuai:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.

Dan memberikan peran kepada pengguna:

SQL> GRANT instructor TO teacher1;

Grant succeeded.

Selanjutnya saya keluar dengan sqlplus exit;dan terhubung sebagai pengguna baru untuk mengujinya. Saya berhasil masuk ke database dengan:

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

Tetapi ketika saya mencoba untuk memilih dari tabel dikatakan:

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

Apa yang saya lewatkan di sini ?!

Sayyid Mohammad
sumber

Jawaban:

19

Anda membuat tabel dalam SYSskema (yang seharusnya tidak pernah Anda lakukan. Sungguh, tidak pernah ).

Saat Anda masuk karena teacher1pernyataan apa pun mencari objek dalam skema itu. Tetapi tidak ada TEACHER1.INSTRUCTORStabel, karena nama aslinya adalah SYS.INSTRUCTORS(apakah saya menyebutkan ide yang buruk untuk membuat objek dalam skema SYS?).

Anda perlu menjalankan select * from sys.instructorsuntuk mendapatkan akses ke tabel itu. Jika Anda tidak ingin awalan nama tabel dengan skema, buat sinonim dalam teacher1skema:

create synonym teacher1.instructors for sys.instructors;

Kemudian teacher1dapat mengakses tabel dari SYSskema tanpa sepenuhnya memenuhi syarat.

Sekali lagi: berhenti menggunakan akun SYS atau SYSTEM untuk apa pun yang bukan barang DBA. Gunakan akun reguler untuk itu.

seekor kuda tanpa nama
sumber
Terima kasih. Saya harus membuat tabel yang dapat diakses banyak pengguna. Dari penjelasan Anda, saya menyimpulkan bahwa saya harus membuat pengguna baru seperti dbadmindengan DBAhak istimewa, dan membuat semua tabel dengan pengguna DBA ini. Maka semua pengguna lain harus mengakses tabel dari DBADMINskema ... Benar?!
Seyed Mohammad
5
@SeyedMohammad: Tidak perlu membuat pengguna DBA. Buat pengguna biasa dan buat tabel dalam skema itu. Kemudian berikan pilih pada tabel tersebut ke pengguna lain. Menggunakan peran DBA untuk hal lain selain pekerjaan DBA bukanlah ide yang baik.
a_horse_with_no_name