私は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.
次にexit;
でsqlplusを終了し、新しいユーザーとして接続してテストしました。私は正常にデータベースにログインしました:
$ 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
スキーマにテーブルを作成しました(これはneverを使用する必要があります。実際には、never)。
teacher1
としてログインすると、すべてのステートメントがそのスキーマ内のオブジェクトを探します。ただし、実際の名前はTEACHER1.INSTRUCTORS
であるため、SYS.INSTRUCTORS
テーブルはありません(SYSスキーマにオブジェクトを作成するというのがbadの考え方だと思いますか?)。
そのテーブルにアクセスするには、select * from sys.instructors
を実行する必要があります。テーブル名の前にスキーマを付けたくない場合は、teacher1
スキーマにシノニムを作成します。
create synonym teacher1.instructors for sys.instructors;
次に、teacher1
は、完全修飾なしでSYS
スキーマからテーブルにアクセスできます。
繰り返しますが、DBA以外のものについては、SYSまたはSYSTEMアカウントの使用を停止してください。通常のアカウントを使用してください。