Вы иногда видите ошибку ora-00942 при выполнении оператора SQL. У нее есть несколько причин, и, как обычно, синтаксис ошибки не самый описательный. Если вы столкнулись с этим и хотите знать, как исправить ошибку ora-00942, читайте дальше.

Содержание

Насколько я знаю, существует три основные причины ошибки ora-00942:

  1. Недостаточные привилегии пользователя
  2. Таблица или представление фактически не существует
  3. Таблица или представление находится в другой схеме

Я покажу вам, как устранить каждую из них.

Как исправить ошибку ora-00942

Исправление ошибки ora-00942

Прежде всего, небольшая оговорка. Я не DBA, я администратор Windows и техник по настольному и серверному оборудованию. Я знаю, как запускать SQL, но не до такой степени, и уж точно не до такого уровня, чтобы устранять неполадки. Мне пришлось обратиться за помощью к моему приятелю Oracle DBA, поэтому, хотя я написал эту статью, все умные части принадлежат ему.

Этот список трех причин ошибки ora-00942 не является исчерпывающим. Существуют и другие случайные причины ее возникновения, но эти три, по-видимому, являются наиболее распространенными.

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

Одной из основных причин ошибки ora-00942 является то, что пользователь не имеет достаточных привилегий для доступа к данной таблице. Вы можете проверить это, выполнив два запроса.

 – list system privileges for the user or role SELECT * FROM dba_sys_privs WHERE grantee IN (&user_role, 'PUBLIC');

— list object privileges for the user or role

SELECT grantee, owner||'.'||table_name object, privilege, grantable FROM dba_tab_privs WHERE grantee IN (&user_role) ORDER BY grantee, owner||'.'||table_name, privilege;

Эти два запроса скажут вам, есть ли у пользователя нужные привилегии для выполнения команды. Если у пользователя есть нужные привилегии, переходите к следующему пункту. Если у пользователя нет нужных привилегий, предоставьте ему их или попросите администратора БД сделать это.

Ошибка ora-00942 также может возникнуть, если пользователь используемой схемы имеет привилегии INSERT, но не имеет привилегий SELECT. Опять же, проверьте уровень привилегий и добавьте SELECT в список или попросите администратора БД сделать это. Очевидно, что специфическая привилегия SELECT должна быть предоставлена каждой схеме, иначе вы все равно увидите ошибку ora-00942.

Как исправить ошибку ora-00942

Таблица или представление фактически не существует

Эта причина ошибки ora-00942 может быть вызвана неправильным синтаксисом запроса или если таблица не существует. Хотя это кажется логичным первым пунктом, с которого следует начать, я уверен, что привилегии пользователя являются причиной ошибки номер один. Отсутствие таблицы или использование неправильного синтаксиса таблицы — вторая.

Чтобы проверить, существует ли таблица, сначала проверьте синтаксис запроса. Если синтаксис правильный, запустите этот запрос.

SELECT owner, object_name, object_type FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND object_name = ‘YOUR_TABLE_NAME';

В последней строке вставьте фактическое имя таблицы, где вы видите ‘YOUR_TABLE_NAME’. Это должно точно сказать вам, существует ли таблица, которую вы пытаетесь запросить, или нет. Если таблица не возвращается, значит таблица, которую вы запрашиваете, не существует в схеме или базе данных.

Если в системе, которую вы используете, есть меню Tables, вы можете вручную проверить наличие таблицы, если хотите, но вышеприведенный запрос сделает свою работу.

Таблица или представление находится в другой схеме

Если у пользователя есть привилегии и таблица существует, а вы все еще видите ошибку ora-00942, это, скорее всего, связано со схемой. Если вы управляете несколькими схемами, легко запустить запрос к чужой схеме. Когда вы заняты и сталкиваетесь с этим, это простая ошибка.

Проверьте схему вручную, если можете, или добавьте имя схемы в строку FROM вашего запроса. Если у вас нет правильных привилегий для новой схемы, вы снова увидите ошибку ora-00942. Вернитесь к первому варианту исправления привилегий пользователя и проверьте соответствующую схему или попросите вашего DBA сделать это за вас.

Как упоминалось выше, я консультировался с моим приятелем Oracle DBA для написания этой статьи, так что вся заслуга за тяжелую работу принадлежит ему. Если вы найдете здесь какие-либо ошибки или упущения, они принадлежат только мне. Дайте мне знать в разделе комментариев, если я что-то упустил или неправильно понял, и я это исправлю.

Если вы знаете другой способ исправить ошибку ora-00942, расскажите нам об этом ниже!

YouTube видео: Как исправить ошибку ora-00942


Because this post is the top one found on stackoverflow when searching for “ORA-00942: table or view does not exist insert”, I want to mention another possible cause of this error (at least in Oracle 12c): a table uses a sequence to set a default value and the user executing the insert query does not have select privilege on the sequence. This was my problem and it took me an unnecessarily long time to figure it out.

To reproduce the problem, execute the following SQL as 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;

Then, execute this insert statement as user2:

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

The result will be “ORA-00942: table or view does not exist” even though user2 does have insert and select privileges on user1.customer table and is correctly prefixing the table with the schema owner name. To avoid the problem, you must grant select privilege on the sequence:

grant select on seq_customer_id to user2;

Содержание

  • 1 Исправьте ошибку ora-00942
    • 1.1 Недостаточно прав пользователя
    • 1.2 Таблица или представление на самом деле не существуют
    • 1.3 Таблица или представление находятся в другой схеме

Иногда вы видите ошибку ora-00942 при выполнении оператора SQL. У него есть несколько причин, и, как обычно, синтаксис ошибок не является наиболее описательным. Если вы сталкиваетесь с этим и хотите знать, как исправить ошибку ora-00942, читайте дальше.

Насколько я знаю, есть три основные причины ошибки ora-00942:

  1. Недостаточно прав пользователя
  2. Таблица или представление на самом деле не существуют
  3. Таблица или представление находятся в другой схеме

Я покажу вам, как обратиться к каждому.

Исправьте ошибку ora-00942

Прежде всего, небольшой отказ от ответственности. Я не администратор баз данных, я администратор Windows, а также специалист по аппаратному и настольному оборудованию. Я знаю, как запустить SQL, но не до какой-то степени опыта и, конечно, не до уровня, который может устранять проблемы. Я должен был попросить моего друга Oracle DBA о помощи, поэтому, пока я писал эту часть, все умные биты принадлежали ему.

Этот список из трех причин ошибки ora-00942 не является исчерпывающим. Есть, очевидно, другие случайные причины этого, но эти три, по-видимому, наиболее распространены.

Недостаточно прав пользователя

Одной из основных причин ошибки ora-00942 является то, что у пользователя недостаточно прав для доступа к рассматриваемой таблице. Вы можете проверить это, выполнив два запроса.

-- перечислить системные привилегии для пользователя или роли
SELECT * FROM dba_sys_privs
ГДЕ получатель гранта (user_role, 'PUBLIC');

— список привилегий объекта для пользователя или роли

SELECT грантополучатель, владелец || '.' || объект table_name, привилегия, грантируемое
FROM dba_tab_privs
ГДЕ получатель гранта (user_role)
ORDER BY грантополучатель, владелец || '.' || table_name, привилегия;

Эти двое скажут вам, имеет ли данный пользователь правильные привилегии для запуска команды. Если пользователь имеет правильные привилегии, переходите к следующему. Если пользователь не имеет правильных привилегий, предоставьте их им или попросите администратора БД сделать это.

Ошибка ora-00942 также может возникнуть, если пользователь используемой схемы имеет привилегии INSERT, но не привилегии SELECT. Опять же, проверьте уровень привилегий и добавьте SELECT в список или попросите администратора БД сделать это. Очевидно, что каждой схеме должна быть предоставлена ​​определенная привилегия SELECT, в противном случае вы все равно увидите ошибку ora-00942.

Таблица или представление на самом деле не существуют

Причиной ошибки ora-00942 может быть неправильный синтаксис запроса или отсутствие таблицы. Хотя это может показаться логичным для начала, я уверен, что привилегия пользователя является причиной ошибки номер один. Таблица, которой там нет или используется неверный синтаксис таблицы, занимает второе место.

Чтобы проверить, существует ли таблица, сначала проверьте синтаксис запроса. Если синтаксис правильный, запустите этот запрос.

ВЫБЕРИТЕ владельца, имя_объекта, тип_объекта
ОТ всех_объектов
WHERE object_type IN ('TABLE', 'VIEW')
AND имя_объекта = ‘YOUR_TABLE_NAME ';

В последней строке вставьте фактическое имя таблицы, где вы видите «YOUR_TABLE_NAME». Это должно точно сказать вам, существует ли таблица, к которой вы пытаетесь обратиться, или нет. Если он возвращается без таблицы, запрашиваемая вами таблица не существует в схеме или базе данных.

Если в используемой вами системе есть меню «Таблицы», вы можете вручную проверить таблицу, если хотите, но вышеуказанный запрос выполняет свою работу.

Таблица или представление находятся в другой схеме

Если у пользователя есть права, и таблица существует, но вы все еще видите ошибку ora-00942, скорее всего, это связано со схемой. Если вы управляете несколькими схемами, легко выполнить запрос к схеме, которая не принадлежит вам. Когда вы заняты и против этого, это простая ошибка, чтобы сделать.

Проверьте схему вручную, если можно или добавьте имя схемы в строке ОТ вашего запроса. Если у вас нет правильных привилегий для новой схемы, вы снова увидите ошибку ora-00942. Вернитесь к первому исправлению привилегий пользователя и проверьте соответствующую схему или попросите своего администратора базы данных сделать это за вас.

Как упомянуто выше, я проконсультировался с моим приятелем по DBA Oracle для этой работы, так что вся заслуга ему в тяжелой работе. Если вы обнаружите здесь какие-либо ошибки или упущения, они одни. Дайте мне знать в разделе комментариев, если я что-то пропустил или ошибся, и я исправлю это.

Если вам известен какой-либо другой способ исправить ошибку ora-00942, сообщите нам об этом ниже!