Пользовательская таблица или представление не существует оракула

Обновлено: 21.11.2024

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

Ответ. Существует несколько распространенных операций, вызывающих ошибку ORA-00942:

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

ORA-00942 при импорте таблицы (imp или impdp).

ORA-00942 при обновлении материализованного представления.

Во-первых, воспользуемся командой oerr, чтобы просмотреть сведения об ошибке ORA-00942:

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

Причина: введенная таблица или представление не существуют, был использован синоним, который здесь не разрешен, или представление было сослано там, где требуется таблица.

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

Действие: проверьте каждое из следующих действий:

- написание имени таблицы или представления.
- что представление не указано там, где требуется таблица.
- что существует существующая таблица или имя представления.
- Обратитесь к администратору базы данных, если необходимо создать таблицу или
если для доступа к таблице требуются права пользователя или приложения.

Кроме того, если вы пытаетесь получить доступ к таблице или представлению в другой схеме, убедитесь, что указана правильная схема и предоставлен доступ к объекту.

Эта ошибка ORA-00942 при вставке часто встречается, когда пользователь, под именем которого вы вошли, не имеет разрешения на просмотр таблицы!

Либо сделайте таблицу общедоступной и предоставьте привилегии DML:

подключить myuser/mypass
создать общедоступную тестовую таблицу синонимов для myuser.testtable
предоставить вставку, выбор, обновление, удаление в mytable для общего доступа;

Кроме того, вы можете изменить вставку, указав имя владельца таблицы:

вставить в myuser.TestTable


Многие пользователи сталкиваются с ORA-00942 при попытке импорта на уровне таблицы. В таких ситуациях генерируется ORA-00942, потому что таблица, участвующая в импорте, фактически взята из другой таблицы, которая не импортируется.

Oracle предлагает отличную информацию об ORA-00942, когда он возникает после импорта, где объясняется, что система искала родительскую таблицу для другой (дочерней) таблицы. Чтобы разрешить ORA-00942, Oracle предлагает следующее решение:

Отключить ограничения внешних ключей

1. Используйте import Show = Y, чтобы увидеть, что намеревается сделать import, Show = Y на самом деле ничего не импортирует.

Из этого вы сможете увидеть, есть ли в вашей таблице дочернее ограничение.

Включите журнал=

для создания журнала импорта, чтобы у вас была запись о том, что происходит.

2. Импортируйте таблицу с Show = N и Rows = N, чтобы построить новую таблицу. Будет импортирована только структура таблицы.

3. Отключите все ограничения для новых таблиц.

4. Снова импортируйте таблицу с параметром Ignore = Y, чтобы избежать ошибок «Таблица уже существует» [например, ORA-00942].

При желании снова включите ограничения для новой таблицы.

Если вы получаете сообщение ORA-00942 при попытке обновления, администратор базы данных сталкивается с ошибкой ORA-00942 после попытки обновить материализованное представление с помощью dbms_view.refresh:

begin dbms_mview.refresh('STATUS_REP'); конец;

*
ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует
ORA-06512: в "SYS.DBMS_SNAPSHOT", строка 617
ORA- 06512: в "SYS.DBMS_SNAPSHOT", строка 674
ORA-06512: в "SYS.DBMS_SNAPSHOT", строка 654
ORA-06512: в строке 1

В этом случае вы не знаете, какая из таблиц в материализованном представлении вызывает ошибку ORA-00942. Этому пользователю было рекомендовано включить трассировку SQL (TKPROF) на уровне сеанса, чтобы определить точную таблицу, в которой возникает ошибка ORA-00942.

Бурлесон — американская команда

Примечание. Эта документация по Oracle была создана в качестве справочника по поддержке и обучению Oracle для использования нашими специалистами-консультантами по настройке производительности администраторов баз данных. Не стесняйтесь задавать вопросы на нашем форуме Oracle.

Проверьте опыт! Любой, кто рассматривает возможность использования услуг эксперта службы поддержки Oracle, должен самостоятельно проверить свои полномочия и опыт, а не полагаться на рекламу и самопровозглашенный опыт. Все законные эксперты Oracle публикуют свои квалификации Oracle.

Ошибки? Технология Oracle меняется, и мы стараемся обновлять нашу информацию о поддержке BC Oracle. Если вы обнаружите ошибку или у вас есть предложение по улучшению нашего контента, мы будем признательны за ваш отзыв. Просто электронная почта:

и укажите URL-адрес страницы.


Burleson Consulting

Оракул поддержки баз данных

Ошибка SQL ORA-00942: таблица или представление не существует очень распространена. Я читал ваши комментарии на днях. Следовательно, я увидел, что у некоторых из вас, ребята, возникают проблемы с поиском таких объектов, как таблицы или представления в схеме, и они сталкиваются с ошибкой.

Так что же означает эта ошибка «ORA-00942: таблица или представление не существует»?

Это означает именно то, что он говорит, таблица или представление, для которых вы выполняете свой запрос, не существует в вашей схеме. Чтобы объяснить, всякий раз, когда вы выполняете запрос, который включает таблицу, представление, синоним или кластер, который не существует в схеме, к которой вы подключены, механизм SQL покажет вам эту ошибку.

Итак, как мы можем решить эту проблему?

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

Есть ли способ проверить, какие объекты есть в нашей схеме?

Да, мы можем легко проверить, сколько объектов создано и сохранено в схеме. Помимо их типов и названий.

Oracle предоставляет представление, предварительно созданное в схеме SYS. И с его помощью мы можем узнать, сколько объектов в схеме, а также каковы их типы и имена. Имя этого представления — TAB.

Что это за представление TAB?

TAB – это предварительно созданное представление, которое сохраняется в схеме SYS базы данных Oracle. Кроме того, это представление хранит имя, тип и идентификатор кластера всех таблиц, представлений, синонимов и кластеров, созданных в схеме базы данных.

Нужно ли нам создавать это представление?

Нет, представление TAB создается движком Oracle во время создания базы данных, поэтому вам не нужно об этом беспокоиться.

Можем ли мы использовать это представление в любой схеме базы данных?

Представление TAB может быть легко доступно любому пользователю/схеме базы данных через его общедоступный синоним. Более того, наряду с представлением TAB, механизм Oracle также создает свой общедоступный синоним с тем же именем. Что обеспечивает безопасный доступ к представлению TAB к любой схеме в базе данных.

Кроме того, представление TAB и его общедоступный синоним имеют одинаковое имя TAB и одинаковую структуру, так что не путайте.

Какова структура представления TAB?

Представление TAB состоит из трех столбцов: TNAME, TABTYPE и CLUSTERID. Первые два столбца имеют тип VARCHAR2 и содержат имя объекта базы данных и их типы. Между тем третий столбец имеет тип NUMBER и содержит идентификатор кластера кластера, если вы создали его в своей схеме.

Ознакомьтесь со структурой представления TAB здесь.

Информационный байт:
Вы можете проверить структуру представления TAB, просто используя команду DESCRIBE, например
DESC ТАБ;

Хорошо, думаю, я ответил почти на все вопросы о представлении TAB. Вы думаете, что что-то упущено или у вас все еще есть сомнения? Тогда не стесняйтесь писать мне в Facebook или Twitter.

В любом случае, теперь давайте сделаем несколько примеров.

Сначала вам нужно подключиться к схеме, информацию об объекте которой вы хотите узнать. Например, допустим, я хочу узнать, сколько объектов создано в схеме HR и каковы их имена. Как только вы решили это сделать, подключите свою базу данных к этой схеме.

Вы также можете прочитать мой блог о том, как подключиться к базе данных с помощью SQL Developer и SQL*Plus.

Прежде чем показать вам примеры представления TAB, позвольте мне сказать вам, что я подключаюсь к своей базе данных через пользователя HR. Но вы можете использовать любой из этих запросов в любом пользователе/схеме по вашему желанию. Они покажут вам соответствующий результат.

Пример 1. Покажите мне полную информацию обо всех таблицах, представлениях, синонимах и кластерах, созданных в моей схеме.

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

Пример 2. Покажите общее количество объектов, созданных в моей схеме.

Чтобы узнать общее количество объектов, созданных в схеме, вы можете использовать функцию COUNT с представлением TAB. Нравится

При успешном выполнении этот запрос покажет вам общее количество объектов, созданных в вашей схеме.

Пример 3. Покажите, сколько таблиц есть в схеме и каковы их имена.

Чтобы узнать информацию о конкретном объекте, вы можете использовать предложение WHERE и отфильтровать результат.

Этот запрос покажет информацию обо всех объектах схемы, которые являются таблицами. Вы можете уточнить этот запрос следующим образом:

Это покажет вам только имена всех таблиц, созданных в схеме. Если вы хотите узнать только общее количество таблиц, созданных в схеме, вы можете изменить этот запрос следующим образом:

Это покажет вам общее количество таблиц, созданных в вашей схеме.

Таким образом, вы можете настроить запросы в соответствии со своими потребностями.

Теперь, если вы внимательно ознакомились с блогом, примите участие в опросе на моей странице в Facebook и проверьте свои знания.

Если вы хотите проверить информацию обо всех «представлениях» вашей схемы, то какой запрос вы считаете правильным? – Запрос…

Автор: Маниш Шарма, четверг, 4 января 2018 г.< /цитата>

ORA-00942 означает, что синтаксический анализатор SQL не обнаружил такой таблицы или представления в доступной для использования области при синтаксическом анализе оператора SQL. Другими словами, таблицы или представления не существует. Используемая область — это диапазон, который определяет, какие таблицы и представления вы можете использовать и как вы можете их использовать. На самом деле почти все разработчики SQL когда-либо видели эту ошибку. Однако настоящие причины ORA-00942 могут различаться от случая к случаю.

ORA-00942 из-за отсутствия прав на использование таблицы

Давайте рассмотрим пример запроса таблицы, принадлежащей другому пользователю.

SQL> conn sh/sh
Подключено.
SQL> выберите first_name из hr.employees, где last_name = 'Chen';
выберите first_name из hr.employees, где last_name = 'Chen'
*
ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует

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

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

SQL> выберите * из all_tables, где владелец = 'HR';

строки не выбраны

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

Решения для ORA-00942

Решения для ORA-00942 просты: вы можете запросить у администратора базы данных или у владельца таблицы объектную привилегию SELECT . Другими словами, нарисуйте его в поле нашего зрения.

SQL> предоставляет выбор на hr.employees для sh;

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

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

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

Просмотр и синоним

Давайте рассмотрим более сложный случай с ORA-00942, в котором участвовал администратор баз данных, пытавшийся СОЗДАТЬ ПРОСМОТР для третьей стороны.

SQL> conn / as sysdba
SQL> create view sh.employees as select * from hr.employees;
создать представление sh.employees as select * from hr.employees
*
ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует

ORA-00942 здесь не означает, что DBA не имеет права использовать таблицу, в данном случае она предназначалась для третьего пользователя SH. Хорошо, мы пошли другим путем, создав синоним для получателя гранта, SH .

SQL> создать синоним sh.employees для hr.employees;

Хотя синоним был успешно создан без ORA-00942, он бесполезен до тех пор, пока базовая таблица не будет предоставлена ​​получателю прав, т. е. не будет рассматриваться как существующая в области действия получателя прав. Как уже отмечалось, принцип всегда один и тот же: пользователь должен иметь соответствующие привилегии для использования чужих объектов.

Что мы увидим, если попытаемся описать синоним?

SQL> conn sh/sh
Подключено.
SQL> desc SH.EMPLOYEES ;
ОШИБКА:
ORA-04043: объект "HR"."СОТРУДНИКИ" не существует

В приведенном выше примере мы пытались описать синоним, но в конечном итоге он передал базовую таблицу. Следовательно, для неизвестного объекта был выдан ORA-04043 вместо ORA-00942.

ORA-00942 из-за отсутствия права на ссылку на таблицу

Если ваше ограничение должно ссылаться на таблицу, принадлежащую другим пользователям, вы должны получить для этой таблицы объектную привилегию REFERENCES. Например:

SQL> conn sh/sh
Подключено.
SQL> создать временную таблицу (номер идентификатора, номер e_id, текст varchar2(30));

SQL> изменить временное ограничение таблицы добавить ограничение fk_eid внешний ключ (e_id) ссылается на hr.employees (employee_id);
изменить временное ограничение таблицы добавить ограничение fk_eid внешний ключ (e_id) ссылается на hr.employees (employee_id)
*
ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует

Решения для ORA-00942

Чтобы разрешить ORA-00942 в такой ситуации, мы должны предоставить REFERENCES на таблицу получателю следующим образом:

SQL> соединение час/час;
Подключено.
SQL> предоставляет ссылки на hr.employees для sh;

Попробуем снова добавить внешний ключ.

SQL> conn sh/sh
Подключено.
SQL> изменить временное ограничение таблицы добавить ограничение fk_eid внешний ключ (e_id) ссылается на hr.employees (employee_id);

Как мы видим, было добавлено ограничение ссылки, указывающее на таблицу другого пользователя.

ВЫБОР и ССЫЛКИ

  • Привилегия SELECT не является правильным выбором для устранения ошибки ORA-00942 в таком образце ошибки. Поскольку представлена ​​только привилегия SELECT, в этом случае вы получите ORA-01031 вместо ORA-00942.
  • Для удобства вы можете предоставить привилегию SELECT для роли, но вы не можете предоставить роли REFERENCES, что приведет к ошибке ORA-01931.
  • Не существует такой системной привилегии REFERENCE ANY TABLE, как и SELECT ANY TABLE, доступной администратору баз данных для предоставления. Нет, не так.

ORA-00942 из-за отсутствия имени схемы

Прежде всего, мы предоставили SH привилегию SELECT для таблицы EMPLOYEES из HR, что означает, что SH может запрашивать EMPLOYEES, даже если она ему не принадлежит.

SQL> conn hr/hr
Подключено.
SQL> предоставляет выбор сотрудникам для sh;

Феномен

От имени пользователя SH мы попытались запросить таблицу.

SQL> conn sh/sh
Подключено.
SQL> выберите first_name из сотрудников, где last_name = 'Chen';
выбрать first_name из сотрудников, где last_name = 'Chen'
*
ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует

Почему ORA-00942? Разве нам не предоставлен доступ к таблице? Это потому, что мы забыли префикс имени схемы. Без префикса имени схемы синтаксический анализатор SQL будет искать таблицу в области действия текущего пользователя, SH . Нам лучше запросить USER_TABLES, чтобы наверняка перечислить все таблицы, принадлежащие текущему пользователю SH.

Решения для ORA-00942

У нас может быть несколько решений для ORA-00942, первое очень простое, просто добавьте префикс к имени схемы.

1. Имя схемы префикса

SQL> выберите first_name из hr. сотрудники, где last_name = 'Чен';

Наиболее безопасным способом использования объектов схемы может быть использование префикса имени схемы в операторах любого типа, особенно когда вы используете ссылку на базу данных для извлечения данных из удаленной базы данных. Я говорил о некоторых примерах использования ссылки на базу данных, включая правильные и неправильные, в другом посте: Ссылка на базу данных, как и почему

2. Используйте частные или общедоступные синонимы

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

Только для текущего пользователя мы можем создать частный синоним для этой таблицы:

SQL> conn sh/sh
Подключено.
SQL> создать или заменить сотрудников-синонимов на hr.employees;

Для всех пользователей мы можем создать общедоступный синоним для этой таблицы:

SQL> conn / as sysdba
Подключен.
SQL> создать или заменить общедоступный синоним сотрудников на hr.employees;

Теперь мы можем снова без проблем повторить оператор, потому что синоним будет заменен базовым объектом во время выполнения.

SQL> выберите first_name из сотрудников, где last_name = 'Chen';

Иными словами, ORA-00942 можно решить без изменения утверждений, используя синоним. Мы можем сэкономить время на модификации исходных программ.

3. Переключить имя рабочей схемы

Если мы хотим использовать чужую схему для остальных операторов SQL, мы можем переключить текущую схему на владельца следующим образом:

SQL> изменить набор сеансов current_schema=hr;

Таким образом, мы устанавливаем текущую схему как HR , поэтому мы можем игнорировать имя схемы для остальных операторов. Другими словами, нам не нужно добавлять префикс имени схемы для решения ORA-00942, потому что наша рабочая схема была изменена.

SQL> выберите first_name из сотрудников, где last_name = 'Chen';

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

ORA-00942 из-за неправильного написания имени таблицы

Мы могли думать, что были правы, но в конечном итоге ошибались. Например:

SQL> выберите first_name из hr.emlpoyees, где last_name = 'Chen';
выберите first_name из hr.emlpoyees, где last_name = 'Chen'
*
ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует

Вы заметили это? Имя таблицы я написал намеренно с ошибкой, в итоге ORA-00942 была нашей компанией. На самом деле опечатки случаются постоянно. Таблица с ошибками или представление, конечно, не существует. Точно так же, как мы хотели напечатать «нравится», но в итоге набрали «лайк».

Решения для ORA-00942

SQL> выберите table_name из all_tables, где владелец = 'HR';

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

Некоторые инструменты с графическим интерфейсом, такие как Toad, разработчик PL/SQL или разработчик SQL, также могут уменьшить ORA-00942, автоматически заполняя имя объекта в своих редакторах SQL. Извините для пользователей sqlplus, в нем нет проверки орфографии.

Автозаполнение имени таблицы в редакторе SQL Developer, чтобы избежать ошибки ORA-00942

ORA-00942 из-за отсутствия кавычек в таблице

Прежде всего мы создаем таблицу small в точной форме, заключая имя в кавычки.

SQL> создать таблицу "маленькая" (c1 int);

Феномен

Затем мы попытались запросить эту новую таблицу следующим образом:

SQL> выберите * из малого;
выберите * из маленьких
*
ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует

Не заключая имя таблицы в кавычки, запрос искал таблицу в верхнем регистре с именем SMALL по умолчанию, а не маленькую с точки зрения синтаксического анализатора SQL. Следовательно, синтаксический анализатор SQL не нашел ничего существующего и выдал ORA-00942, чтобы уведомить об этой проблеме. Это может показаться странным, но именно так работает точная форма, правило именования в кавычках.

Решения для ORA-00942

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

SQL> выберите * из "маленьких";

строки не выбраны

Хорошо! По крайней мере, на этот раз у нас нет ORA-00942.

Для доказательства этого мы можем проверить исходное имя таблицы с помощью этого запроса.

SQL> выберите table_name из списка user_tables в порядке 1;

В конце концов, это таблица с нижним регистром по сравнению с обычными таблицами с верхним регистром. Кроме того, мы можем создать таблицу с тем же именем без учета регистра.

SQL> создать небольшую таблицу (c1 int);

Нет никакой хитрости, хотя я использовал в операторе имя в нижнем регистре без кавычек, была создана таблица с именем SMALL в верхнем регистре, которая отличается от small в пространстве имен текущего пользователя.

SQL> выберите table_name из списка user_tables в порядке 1;

Кроме того, нет конфликта имен, нет ORA-00942, если они существенно различаются.

ORA-00942 из-за отсутствия таблицы

Некоторые объекты базы данных могут вести себя как таблицы, но по существу они не являются таблицами. Вот пример объекта с именем HAPPY_EMPLOYEES .

SQL> выберите имя, фамилию из happy_employees;

FIRST_NAME LAST_NAME
------ --------------------- ----
Нэнси Гринберг
Даниэль Фавиет
Джон Чен
Исмаэль Шиарра
Хосе Мануэль Урман
Луис Попп

Выбрано 6 строк.

ORA-00942 при ALTER TABLE

Давайте рассмотрим пример ALTER TABLE .

SQL> изменить перемещение таблицы happy_employees;
изменить таблицу happy_employees, переместить
*
ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует

В сообщении об ошибке говорилось, что мы попытались найти таблицу с именем HAPPY_EMPLOYEES , но ничего не нашли.

ORA-00942 при удалении таблицы

Вы даже не можете DROP TABLE .

SQL> удаление таблицы happy_employees purge;
удалить таблицу happy_employees purge
*
ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует

Удалена ли таблица до наших действий? На самом деле объект не является столом, хотя и выглядит как стол.Вот почему синтаксический анализатор SQL отметил отсутствие проблемы.

Решения для ORA-00942

Теперь нам нужно узнать, что это за тип объекта. Может оказаться полезным представление словаря USER_OBJECTS.

SQL> выберите object_type из user_objects, где object_name = upper('happy_employees');

В результате это ПРОСМОТР. Теперь вопрос: что такое базовая таблица? Как мы можем найти это? На самом деле, мы можем узнать этот факт, запросив USER_VIEWS :

SQL> выберите текст из user_views, где view_name = upper('happy_employees');

Не только представления, но и синонимы также являются объектами схемы, основанными на таблицах. То есть независимо от того, что вы пытаетесь сделать, ALTER TABLE или DROP TABLE , вы должны делать это на их базовых таблицах в случае ORA-00942.

Вы получили сообщение об ошибке ORA-00942? Я объясню причину и решение ошибки в этой статье.

Сообщение об ошибке появляется при попытке запустить инструкцию SQL:

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

Это происходит по одной из многих причин:

  • Выражение ссылается на несуществующую таблицу или представление
  • У вас нет доступа к этой таблице или представлению.
  • Таблица или представление принадлежат другой схеме, и вы не указали имя схемы
  • Вы используете Oracle 12c, используя последовательность в качестве значения по умолчанию, но не имеете прав выбора для этой последовательности.

Причина ошибки должна быть одинаковой для каждой версии базы данных. Не имеет значения, получаете ли вы эту ошибку «таблица или представление не существует» в Oracle 10g, Oracle 11g или Oracle 12c.

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

Давайте рассмотрим некоторые решения в зависимости от причины.

Решение ORA-00942

Есть несколько решений этой ошибки, в зависимости от причины.

Сначала убедитесь, что таблица существует. Вы можете сделать это, запустив этот запрос:

Замените слово OBJECT_NAME именем вашей таблицы. Он также должен быть в верхнем регистре.

">ВЛАДЕЛЕЦ ">OBJECT_NAME ">OBJECT_TYPE
">СИСТЕМА ">КЛАСС ">TABLE

Если ваша таблица не отображается, значит, ее не существует, и вам нужно выяснить, почему она не существует.

Или, если вы используете SQL Developer, вы можете проверить существование таблицы, развернув раздел Таблицы в левой части экрана. Если вы видите там таблицу, значит она существует и вы ее владелец.

Далее проверьте владельца таблицы.

Если таблица существует и вы получаете эту ошибку, проверьте владельца таблицы.

Вы можете использовать тот же запрос, что и выше, и указать владельца таблицы.

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

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

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

Допустим, ваше имя пользователя — «боб». У вас есть набор таблиц по схеме "bob".

Если вы хотите выбрать из таблицы с именем «сотрудник», и она находится в схеме «мэрия», она принадлежит «мэрии». Когда вы обращаетесь к таблице (например, в операторе SELECT), у вас может быть такой запрос:

В этот момент вы можете получить сообщение об ошибке ORA-00942. Это связано с тем, что Oracle ищет в вашей схеме или «боб» таблицу сотрудников. Но его нет в вашей схеме — он есть в схеме «mary».

Поэтому вам нужно изменить свой запрос, включив в него имя схемы.

Этот запрос должен выполняться без ошибки.

Oracle 12c и последовательности

Если вы получаете таблицу ora-00942 или представление, которое не существует в Oracle 12c, это может быть вызвано следующей ситуацией:

  • У другого пользователя есть таблица и последовательность
  • Один из столбцов в таблице имеет значение по умолчанию sequence.nextval
  • У вас есть права доступа к таблице

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

Рассмотрите такую ​​ситуацию:

Теперь войдите в систему как «mary»:

Здесь вы получите сообщение об ошибке ORA-00942.

Причина этого в том, что у «mary» нет привилегий SELECT для sequence_book_id. У нее есть привилегии INSERT для таблицы, но в результате вставки в таблицу вызывается SELECT последовательности, что вызывает эту ошибку.

Чтобы решить эту проблему, предоставьте права SELECT второму пользователю.

Теперь это должно работать.

Я надеюсь, что эта статья помогла вам устранить ошибку ORA-00942.

Наконец, если вам понравилась информация и советы по карьере, которые я предоставляю, подпишитесь на мою рассылку ниже, чтобы быть в курсе моих статей. Вы также получите фантастический бонус. Спасибо!

Оставить комментарий Отменить ответ

Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются данные ваших комментариев.


Бен Брамм
DatabaseStar

Читайте также: