В моем представлении Oracle используется таблица, которая не существует, но я все еще могу запросить ее - PullRequest
4 голосов
/ 04 ноября 2010

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

Содержится ли содержимое представления где-то в кэше, начиная с момента, когда таблица еще существовала, или я просто недостаточно выгляжу для этой таблицы?

Просто чтобы прояснить: я посмотрел в ALL_TABLES и ALL_OBJECTS, и таблица (или что бы то ни было) не появляется ни в одном из них.

Ответы [ 5 ]

6 голосов
/ 04 ноября 2010

Это очень возможно. Предоставление выбора для представления не дает выбора для базовых таблиц. Это позволяет мне создать представление, которое предоставляет пару столбцов из таблицы, которую я не хочу, чтобы вы видели все. У вас должен быть доступ к таблице, чтобы она отображалась в представлении ALL_TABLES. Если это действительно таблица, вы сможете найти ее в представлении DBA_TABLES (при условии, что у вас есть доступ к представлению DBA_TABLES), в котором есть все, а не только таблицы, на которые у вашего пользователя есть привилегии.

Фактически, представление ALL_TABLES является прекрасным примером этой ситуации. Могу поспорить, что вы также не можете найти таблицы, используемые в этом представлении, поскольку у вас, вероятно, нет разрешений для таблиц SYS, на которых оно основано (например, SYS.user $, SYS.obj $ и т. Д.).

5 голосов
/ 04 ноября 2010

Также проверьте, является ли «отсутствующая» таблица синонимом:

SELECT table_owner, table_name
  FROM all_synonyms
 WHERE table_name = 'MISSING_TABLE';

Если это не синоним, попробуйте поискать в представлении словаря all_tables для вашей таблицы:

SELECT owner, table_name
  FROM all_tables
 WHERE table_name = 'MISSING_TABLE';
1 голос
/ 04 ноября 2010

Может быть, это материализованное представление? Это копия данных, поэтому она будет продолжать существовать, даже если базовая таблица будет удалена.

1 голос
/ 04 ноября 2010

Проверьте схему для ссылок на таблицы в представлении, которое вы не можете найти - вероятно, это не текущая схема, но текущая схема имеет привилегию SELECT (как минимум) для конкретной таблицы.

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

0 голосов
/ 09 декабря 2013

Я бы убедился, что вы не настроили его, сказав

Create Table "TableName"
  ("ColumnName" Number(10,0))....

Если вы затем попытаетесь сослаться на них с помощью следующего скрипта:

Select ColumnName from TableName....

это не сработает. Это связано с тем, что Oracle берет имена без кавычек, такие как TableName, и превращает их в TABLENAME, который не существует, как если бы вы объявили его с помощью «TableName», вы фактически говорили «отвечайте только на запросы с такой точной заглавной буквы, которые также в кавычках"

Итак, сработало бы следующее:

Select "ColumnName" from "TableName"....

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

Вместо этого

Create Table TableName
  (ColumnName Number(10,0))....

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

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