SQL開発者を使用し、ユーザーを作成し、必要なすべての特権でそのユーザーと別の接続を作成した後、システムユーザーとデータベースに接続しました。
しかし、次の手順に進むと、SQLエラーが発生します
ORA-00942表またはビューが存在しません。
INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson')
この投稿は「ORA-00942:テーブルまたはビューが存在しない挿入」を検索するときにstackoverflowで見つかった一番上の投稿なので、このエラーの別の考えられる原因に言及したいと思います(少なくともOracle 12cで):テーブルはシーケンスを使用しますデフォルト値を設定し、挿入クエリを実行するユーザーには、シーケンスに対する選択権限がありません。これは私の問題であり、それを理解するのに不必要に長い時間がかかりました。
問題を再現するには、次のSQLをuser1
として実行します。
create sequence seq_customer_id;
create table customer (
c_id number(10) default seq_customer_id.nextval primary key,
name varchar(100) not null,
surname varchar(100) not null
);
grant select, insert, update, delete on customer to user2;
次に、この挿入ステートメントをuser2
として実行します。
insert into user1.customer (name,surname) values ('michael','jackson');
user2
にはuser1.customer
テーブルに対する挿入特権と選択特権があり、スキーマ所有者名をテーブルに正しくプレフィックスしているにもかかわらず、結果は「ORA-00942:テーブルまたはビューが存在しません」です。問題を回避するには、シーケンスの選択権限を付与する必要があります。
grant select on seq_customer_id to user2;
ユーザーがテーブルを表示するために必要な権限を持っていないか、テーブルが存在しないか、間違ったスキーマでクエリを実行しています
テーブルは存在しますか?
select owner,
object_name
from dba_objects
where object_name = any ('CUSTOMER','customer');
どんな特権を与えましたか?
grant select, insert on customer to user;
最初のクエリから所有者に対してクエリを実行していますか?
「customer」という名前のテーブルに直接アクセスすることはできません。 「user1.customer」にするか、「user1.customer」を指すuser2の同義語「customer」を作成する必要があります。お役に立てれば..
答えは次のとおりです。 http://www.dba-Oracle.com/concepts/synonyms.htm
Oracleシノニムを使用すると、基本的に他の場所に存在するオブジェクトへのポインタを作成できます。 Oracleにログインすると、スキーマ(アカウント)で照会しているすべてのオブジェクトを検索するため、Oracleシノニムが必要です。それらが存在しない場合、それらが存在しないことを通知するエラーが表示されます。
大文字と小文字を区別するテーブル(二重引用符で作成されたテーブル名)も、この同じエラーをスローする可能性があります。 詳細はこの回答をご覧ください .
テーブルを二重引用符で囲むだけです:
INSERT INTO "customer" (c_id,name,surname) VALUES ('1','Micheal','Jackson')