#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 есть хорошее длинное объяснение этого.
В принципе, при разрешении имени оно выглядит:
- Для объектов в вашей схеме с таким именем
- Для общедоступных синонимов с этим именем
- Если имя состоит из нескольких частей (например,
C.mlb_players
, проверяется, соответствует ли первая часть соответствующей схеме, к которой у вас есть доступ.
В вашем примере Oracle не найдет ни один из них. Все они находятся в схемах, отличных от вашей RedSoxRule
схемы, ни один из них не является общедоступным синонимом, и вы не указали mlb_players
имя схемы.
На самом деле не имеет значения, какой тип объекта (таблица, представление, синоним, пакет и т.д.) — Все они обрабатываются одинаково.
Ответ №2:
Если я выполню этот запрос, откуда будут извлечены данные
Нигде. В REDSOXRULE нет объекта, вызываемого mlb_players
, поэтому запрос завершится ошибкой с ORA-00942: table or view does not exist
.
Вам нужно будет добавить к имени таблицы префикс схемы, к которой вы добавляете префикс, например
SELECT *
FROM d.mlb_players;
Давайте предположим, что у вас есть вариант размещенной структуры.
- У REDSOXRULE есть представление
mlb_players
дляa.mlb_players
. Запросselect * from mlb_players
будет выбирать из этого представления, то есть изa.mlb_players
. - Вместо представления REDSOXRULE имеет собственный синоним
mlb_players
дляb.mlb_players
. Запросselect * from mlb_players
будет выбирать из этого синонима, то есть изb.mlb_players
. Обратите внимание, что у вас не может быть частного синонима с тем же именем, что и у таблицы или представления в вашей схеме. - Вместо частного синонима в базе данных есть общедоступный синоним
mlb_players
дляd.mlb_players
. Запросselect * from mlb_players
будет выбирать из этого publicsynonym, то есть изd.mlb_players
.
То есть Oracle сначала ищет объекты, принадлежащие схеме (таблицы, представления, частные синонимы и т.д.). Затем он просматривает общедоступные синонимы. Затем он ищет объекты в других схемах