В каком порядке Oracle будет использовать объекты синонимов, представлений и таблиц? - PullRequest
1 голос
/ 28 марта 2019

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

  • A таблица в схеме "B" с именем "mlb_players"
  • A view в схеме "C" с именем "mlb_players", которая является SELECT для таблицы на сервере "DB2"
  • A синоним в схеме "D" с именем "mlb_players", которая указывает натаблица на сервере "DB3"

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

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

SELECT *
FROM mlb_players

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

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

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

По сути, при разрешении имени это выглядит так:

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

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

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

2 голосов
/ 28 марта 2019

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

Нигде.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 будет выбран из этого общего синонима, то есть из d.mlb_players.

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

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