В каком порядке Oracle будет использовать объекты synonym, view и table?

#oracle #oracle11g

#Oracle #oracle11g

Вопрос:

Допустим, что моя база данных содержит следующие объекты:

  • Таблица в схеме «B» с именем «mlb_players»
  • Представление в схеме «C» с именем «mlb_players», которое ВЫБИРАЕТСЯ по таблице на сервере «DB2»
  • Синоним в схеме «D» с именем «mlb_players», который указывает на таблицу на сервере «DB3»

Все эти объекты предоставлены моей схеме «RedSoxRule»

Если я выполню этот запрос, откуда будут получены данные?

 SELECT *
FROM mlb_players
  

Другими словами, если заданное имя (в данном случае «mlb_players») применимо к разным типам объектов, а предоставленные ПРАВА равны, в каком порядке Oracle найдет запрошенный объект?

Комментарии:

1. experts-exchange.com/questions/28343488/…

2. @RobertKock — вся цель StackOverflow — избавить разработчиков от посещения этого сайта и его пагубного платного доступа.

Ответ №1:

У Oracle есть хорошее длинное объяснение этого.

В принципе, при разрешении имени оно выглядит:

  1. Для объектов в вашей схеме с таким именем
  2. Для общедоступных синонимов с этим именем
  3. Если имя состоит из нескольких частей (например, C.mlb_players , проверяется, соответствует ли первая часть соответствующей схеме, к которой у вас есть доступ.

В вашем примере Oracle не найдет ни один из них. Все они находятся в схемах, отличных от вашей RedSoxRule схемы, ни один из них не является общедоступным синонимом, и вы не указали mlb_players имя схемы.

На самом деле не имеет значения, какой тип объекта (таблица, представление, синоним, пакет и т.д.) — Все они обрабатываются одинаково.

Ответ №2:

Если я выполню этот запрос, откуда будут извлечены данные

Нигде. В REDSOXRULE нет объекта, вызываемого mlb_players , поэтому запрос завершится ошибкой с ORA-00942: table or view does not exist .

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

 SELECT *
FROM d.mlb_players;
  

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

  1. У REDSOXRULE есть представление mlb_players для a.mlb_players . Запрос select * from mlb_players будет выбирать из этого представления, то есть из a.mlb_players .
  2. Вместо представления REDSOXRULE имеет собственный синоним mlb_players для b.mlb_players . Запрос select * from mlb_players будет выбирать из этого синонима, то есть из b.mlb_players . Обратите внимание, что у вас не может быть частного синонима с тем же именем, что и у таблицы или представления в вашей схеме.
  3. Вместо частного синонима в базе данных есть общедоступный синоним mlb_players для d.mlb_players . Запрос select * from mlb_players будет выбирать из этого publicsynonym, то есть из d.mlb_players .

То есть Oracle сначала ищет объекты, принадлежащие схеме (таблицы, представления, частные синонимы и т.д.). Затем он просматривает общедоступные синонимы. Затем он ищет объекты в других схемах