Oracle

在表存在時獲取“ORA-00942:表或視圖不存在”

  • April 30, 2021

我對 Oracle 數據庫相當陌生。我已經安裝Oracle Database 11g R2Oracle 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.

接下來,我退出 sqlplusexit;並以新使用者身份連接以對其進行測試。我成功登錄到數據庫:

$ 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 的東西。為此使用正常帳戶。

引用自:https://dba.stackexchange.com/questions/47074