テーブルが存在するのに「ORA-00942:テーブルまたはビューが存在しない」を取得する


10

私は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

ここで何が欠けていますか?

回答:


19

あなたには、テーブルを作成していないSYSスキーマ(あなたがすべき決して、これまで行いません。本当に、決して)。

teacher1ステートメントとしてログインすると、そのスキーマでオブジェクトが検索されます。しかしTEACHER1.INSTRUCTORS、本当の名前なので、テーブルはありませんSYS.INSTRUCTORS(SYSスキーマにオブジェクトを作成するのは何が悪い考えなのでしょうか?)。

select * from sys.instructorsそのテーブルにアクセスするには、実行する必要があります。テーブル名の前にスキーマを付けたくない場合は、teacher1スキーマにシノニムを作成します。

create synonym teacher1.instructors for sys.instructors;

その後teacher1SYS完全に修飾することなく、スキーマからテーブルにアクセスできます。

繰り返しますが、DBA以外のものについては、SYSまたはSYSTEMアカウントの使用を停止してください。通常のアカウントを使用してください。


ありがとう。複数のユーザーがアクセスできるテーブルを作成する必要があります。あなたの説明から、私dbadminDBA特権などの新しいユーザーを作成し、このDBAユーザーですべてのテーブルを作成する必要があると推測します。次に、他のすべてのユーザーはDBADMINスキーマからテーブルにアクセスする必要があります...正しいですか?
Seyed Mohammad 2013

5
@SeyedMohammad:DBAユーザーを作成する必要はありません。通常のユーザーを作成し、そのスキーマにテーブルを作成します。次に、それらのテーブルの選択を他のユーザーに付与します。DBAロール以外の目的でDBAロールを使用することはお勧めできません。
a_horse_with_no_name 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.