Bắt phiên bản ORA-00942: bảng hoặc chế độ xem không tồn tại trong khi bảng tồn tại


10

Tôi còn khá mới với cơ sở dữ liệu của Oracle. Tôi đã cài đặt Oracle Database 11g R2trên Oracle Linux 6. Tôi đã tạo thành công một cơ sở dữ liệu mới dbcavà kết nối với cơ sở dữ liệu bằng cách sử dụng:

$ sqlplus "/ as sysdba"

Tôi đã tạo thành công một bảng và chèn một số dữ liệu và thực hiện một số lựa chọn:

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

Sau đó, tôi đã tạo một người dùng mới với đặc quyền CONNECT:

SQL> CREATE USER teacher1 IDENTIFIED BY pass1;

User created.

SQL> GRANT CONNECT TO teacher1;

Grant succeeded.

Sau đó, tôi đã tạo một vai trò mới với các đặc quyền đối tượng thích hợp:

SQL> CREATE ROLE instructor;

Role created.

SQL> GRANT SELECT, UPDATE ON Instructors TO instructor;

Grant succeeded.

Và cấp vai trò cho người dùng:

SQL> GRANT instructor TO teacher1;

Grant succeeded.

Tiếp theo tôi đã thoát sqlplus với exit;và kết nối với tư cách là người dùng mới để kiểm tra nó. Tôi đã đăng nhập thành công vào cơ sở dữ liệu với:

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

Nhưng khi tôi cố gắng chọn từ bảng thì nó báo:

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

Tôi đang thiếu gì ở đây?!

Câu trả lời:


19

Bạn đã tạo bảng trong SYSlược đồ (điều mà bạn không bao giờ nên làm. Thực sự, không bao giờ ).

Khi bạn đăng nhập như teacher1bất kỳ câu lệnh nào tìm kiếm các đối tượng trong lược đồ đó. Nhưng không có TEACHER1.INSTRUCTORSbảng, vì tên thật là SYS.INSTRUCTORS(tôi đã đề cập đến ý tưởng tồi là gì khi tạo các đối tượng trong lược đồ SYS?).

Bạn cần phải chạy select * from sys.instructorsđể có quyền truy cập vào bảng đó. Nếu bạn không muốn tiền tố tên bảng với lược đồ, hãy tạo một từ đồng nghĩa trong teacher1lược đồ:

create synonym teacher1.instructors for sys.instructors;

Sau đó teacher1có thể truy cập bảng từ SYSlược đồ mà không cần đủ điều kiện.

Xin nhắc lại: ngừng sử dụng tài khoản SYS hoặc HỆ THỐNG cho bất kỳ thứ gì không phải là công cụ DBA. Sử dụng một tài khoản thường xuyên cho điều đó.


Cảm ơn. Tôi phải tạo các bảng mà nhiều người dùng có thể truy cập nó. Từ lời giải thích của bạn, tôi suy luận rằng tôi nên tạo một người dùng mới, chẳng hạn như dbadminvới các DBAđặc quyền và tạo tất cả các bảng với người dùng DBA này. Sau đó, tất cả người dùng khác nên truy cập các bảng từ DBADMINlược đồ ... Đúng không?!
Seyed Mohammad

5
@SeyedMohammad: Không cần tạo người dùng DBA. Tạo một người dùng thường xuyên và tạo các bảng trong lược đồ đó. Sau đó cấp chọn trên các bảng cho người dùng khác. Sử dụng vai trò DBA cho bất cứ điều gì khác ngoài công việc DBA không phải là một ý tưởng tốt.
a_horse_with_no_name
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.