Oracle
在表存在時獲取“ORA-00942:表或視圖不存在”
我對 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
我在這裡想念什麼?!
您在
SYS
模式中創建了表(您永遠不應該這樣做。真的,永遠不會)。當您以
teacher1
任何語句登錄時,會在該架構中查找對象。但是沒有TEACHER1.INSTRUCTORS
表,因為真正的名字是SYS.INSTRUCTORS
(我有沒有提到在 SYS 模式中創建對像是多麼糟糕的主意?)。您需要執行
select * from sys.instructors
才能訪問該表。如果您不想在表名前加上模式前綴,請在模式中創建同義詞teacher1
:create synonym teacher1.instructors for sys.instructors;
然後
teacher1
可以從SYS
模式訪問表而無需完全限定它。再說一遍:停止將 SYS 或 SYSTEM 帳戶用於任何不是 DBA 的東西。為此使用正常帳戶。