Ошибка SQL: таблица или представление ORA-00942 не существует

Я использую SQL-разработчик, и я создал соединение с моей базой данных с системным пользователем после того, как создал пользователя и сделал другое соединение с этим пользователем со всеми необходимыми привилегиями.

Но когда я пытаюсь продолжить выполнение, я получаю ошибку SQL

Таблица или представление ORA-00942 не существует.:


INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson')

Ответ 1

Поскольку этот пост является верхним, найденным в stackoverflow при поиске "ORA-00942: таблица или представление не существует вставки", я хочу упомянуть еще одну возможную причину этой ошибки (по крайней мере, в 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;

Затем выполните этот оператор insert как user2:

insert into user1.customer (name,surname) values ('michael','jackson');

Результат будет "ORA-00942: таблица или представление не существует", хотя user2 имеет вставку и выбор привилегий в таблице user1.customer и корректно префикс таблицы с именем владельца схемы. Чтобы избежать этой проблемы, вы должны предоставить привилегию выбора в последовательности:

grant select on seq_customer_id to user2;

Ответ 2

либо пользователь не имеет привилегий, необходимых для просмотра таблицы, таблица не существует или вы выполняете запрос в неправильной схеме

существует ли таблица?

select owner, 
       object_name 
from dba_objects 
where object_name = any ('CUSTOMER','customer');

какие привилегии вы предоставили?

grant select, insert on customer to user;

выполняется ли запрос от владельца с первого запроса?

Ответ 3

Вы не можете напрямую обращаться к таблице с именем "клиент". Либо он должен быть "user1.customer", либо создать синоним "клиент" для user2, указывающий на "user1.customer". надеюсь, что это поможет.

Ответ 4

Вот ответ: http://www.dba-oracle.com/concepts/synonyms.htm

Синоним Oracle в основном позволяет вам создавать указатель на объект, который существует где-то в другом месте. Вам нужны синонимы Oracle, потому что когда вы вошли в Oracle, он ищет все объекты, которые вы запрашиваете в своей схеме (учетной записи). Если их там нет, это даст вам сообщение о том, что они не существуют.

Ответ 5

Чувствительные к регистру таблицы (имена таблиц, созданные в двойных кавычках) также могут выдавать ту же ошибку. Смотрите этот ответ для получения дополнительной информации.

Просто оберните таблицу в двойные кавычки:

INSERT INTO "customer" (c_id,name,surname) VALUES ('1','Micheal','Jackson')