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

Обновлено: 04.07.2024

Жила-была таблица Bar в схеме Foo. Давно жила в производственной базе, было у неё не много строк, но весьма много внешних ключей и иных упоминаний. Запросы на чтение к таблице выполнялись каждую минуту, а когда и секунду. DML-запросы случались не часто, около 10-100 в год. Но никогда проблем с ними не было.

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

ora-00942 Table or View Does Not Exists

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

Дополнения.

Запросы не работают как от имени Foo, так и от других пользователей.

Изменения регистра имени таблицы и полей в строке запроса не помогают.

select * from all_objects where object_name like '%BAR%' возвращает

select * from all_tab_columns where table_name = 'BAR' Поля тоже все в верхнем регистре, HEX чистый.

  1. DDL-запрос на добавление нового столбца и его удаление проходит без ошибок.

Ответы (2 шт):

Дело было так. Зачем-то на таблицу Foo.Bar был заведён Materialized Views Log. Это было давным давно. А вот незадолго до появлении проблемы некто переименовал таблицу Foo.M$LOG_Bar в Foo.DeleteMe_M$LOG_Bar .

Т.е. при dml-запросах

ora-00942 Table or View Does Not Exists

означало, что нет таблицы с логом.

Обратное переименование, однако не помогло. Но так как этот лог вовсе не нужен был, помогло его удаление. Теперь DML работают.

Причина указана в ответе ТС. Ошибка действительно воспроизводится в версии 11.2:

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

Так как в дереве зависимостей логи материализованого представления отсутствуют, то для быстрой локализации ошибки надо было: провести поиск всех объектов со схожим именем, ну или просто помнить, что на таблице может существовать MV Log:

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

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

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

ОТВЕТЫ

Ответ 1

Поскольку этот пост является верхним, найденным в stackoverflow при поиске "ORA-00942: таблица или представление не существует вставки", я хочу упомянуть еще одну возможную причину этой ошибки (по крайней мере, в Oracle 12c): таблица использует последовательность для установки значения по умолчанию, и пользователь, выполняющий запрос вставки, не имеет привилегии выбора в последовательности. Это была моя проблема, и мне потребовалось слишком много времени, чтобы понять это.

Чтобы воспроизвести проблему, выполните следующий SQL как user1 :

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

Ответ 5

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

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

Используя базу данных Oracle, используя дизайн Powerdesigner или дизайн navicat, сгенерированный файл Sql импортируется, и появляется запрос «ORA-00942: таблица или представление не существует».

1. Причина проблемы

Oracle чувствителен к регистру, мы создаем наш собственный скрипт Sql ( Название таблицы без кавычек ) При создании таблицы Oracle автоматически преобразует наши имена таблиц и имен полей в верхний регистр.

Но Oracle также поддерживает синтаксис «». После добавления имени таблицы или имени поля в «» Oracle не будет преобразовывать его в верхний регистр.

Если добавлено «», то при использовании общего запроса SQL будет получено «ORA-00942: Таблица или представление не существует», поэтому имя таблицы необходимо добавить к «» в сценарии SQL.

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

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

В PowerDesiger найдите Редактировать текущую СУБД в разделе База данных в меню физической модели данных,

Выберите Script-> Sql-> Format, есть CaseSensitivityUsingQuote, и его комментарий «Определяет, управляется ли чувствительность к регистру для идентификаторов с помощью двойных кавычек»,

Указывает, требуются ли двойные кавычки для указания регистра идентификатора. Вы можете видеть, что значением по умолчанию для значений справа является «ДА», изменено на «Нет», и нажмите кнопку [Применить].

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

Причина:
Оказывается, что когда powerdesigner создает базу данных, все идентификаторы по умолчанию заключаются в двойные кавычки, в результате чего Oracle никогда не различала чувствительность к регистру и чувствительность к регистру этих идентификаторов.

1.Menu: База данных

2.Edit Current DBMS

3. Установите для ORA11GR1 :: Script \ Sql \ Format \ UpperCaseOnly значение Yes во всплывающем диалоговом окне.

4. Установите ORA11GR1 :: Script \ Sql \ Format \ CaseSensitivityUsingQuote в значение No во всплывающем диалоговом окне.

Таким образом, база данных не будет генерировать вышеуказанные проблемы в будущем.

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

Вы можете установить СОБЫТИЕ в файле параметров (обычный текст или spfile), чтобы заставить Oracle сбрасывать подробный файл трассировки в user_dump_dest, может существовать имя объекта, если не SQL.

EVENT = "942 трассировка имени ошибки уровня 12"

Если вы используете обычный текстовый файл, вам нужно сохранить все настройки EVENT в последовательных строках. Не уверен, как это применимо к spfile.

SQL * Plus сообщает вам таблицу, которая не существует. Например:

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

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

Если вы используете инструмент просмотра SQL, такой как TOAD или TORA, это поможет вам с ошибками ORA, выделив или наведя курсор туда, где вы сделали свою ошибку.

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

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

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

Что касается того, почему Oracle решил делать это так, у меня есть некоторые предположения:

Номер ошибки и местоположение - это наименьшее возможное представление диагностической информации. (Экономичность.)

Как я указал выше, упростить создание инструментов, которые подключаются к Oracle. (Совместимость).

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

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