Префиксы схемы в postgres, область действия вызываемых элементов

Будет ли добавление префикса схемы к хранимой процедуре также ограничивать область действия всех процедур, вызываемых внутри нее, этой схемой?

Примите во внимание следующий сценарий:

Скажем, у меня есть хранимая процедура parentProc, которая вызывает proc childAchildB и childC. Эта процедура доступна во всех схемах SchemaA, public и SchemaB вот так:

create or replace procedure parentProc(){
  CALL childA;
  CALL childB;
  CALL childC;
}

SchemaA
|_parentProc
|_childA
|_childB
|_ChildC
SchemaB
|_parentProc
|_childA
|_childB
|_ChildC
public
|_parentProc
|_childA
|_childB
|_ChildC  

путь поиска по умолчанию является общедоступным, поэтому, когда я вызываю dbo.parentProc, будет ли вызываться процедура в той же схеме (dbo) или из public?

Если вместо этого будут представления childA, childB и childC, что произойдет в этом сценарии? Будет ли родительский процесс с префиксом охватывать представления этой схемой?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из мануала:

search_path (строка) Эта переменная определяет порядок, в котором схемы ищутся, когда объект (таблица, тип данных, функция и т. на него ссылается простое имя без указания схемы. Когда там объекты с одинаковыми именами в разных схемах, найденный используется первый в пути поиска. Объект, которого нет ни в одном из на схемы в пути поиска можно ссылаться, только указав их содержащий схему с квалифицированным (точечным) именем.

Это означает, что любой вызов процедуры без квалификации схемы найдет (или не найдет) только ту процедуру, которая находится в общедоступной схеме. Потому что public находится в вашем пути поиска по умолчанию.

Я всегда использую только public по умолчанию, остальное использует квалификацию схемы.

означает, что квалификация в parentProc с использованием dbo.parentproc не имеет значения, если дочерняя схема не квалифицирована явно?

mleko 15.09.2022 08:12
Ответ принят как подходящий

Если вы ссылаетесь на один объект, используя схему, это не меняет того факта, что все неквалифицированные ссылки используют search_path для определения схемы. Итак, если вы

CALL schemaa.parentproc();

но search_path есть schemab, процедура все равно будет вызывать процедуры из schemab.

То же самое относится к представлениям или всем другим объектам, но обратите внимание, что объекты, на которые есть ссылки внутри представления, зависят не от настройки search_path, когда представление используется, а от настройки search_path, когда представление было определено. Это связано с тем, что определяющий запрос анализируется во время создания представления и сохраняется в проанализированном виде.

есть ли способ увидеть проанализированное представление?

mleko 15.09.2022 17:35

Да, загляните в pg_rewrite.

Laurenz Albe 15.09.2022 18:16
he same holds for views or all other objects, but note that the objects referenced inside a view do not depend on the setting of search_path when the view is used... однако это, похоже, имеет чистый эффект вызова представления из публики, если представление внутри процедуры не квалифицировано
mleko 15.09.2022 18:51

Зависит от того, как вы определили представление...

Laurenz Albe 15.09.2022 18:52

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

mleko 15.09.2022 18:54

Да. Объекты, на которые ссылаются в представлении, никогда не зависят от вашего текущего search_path. Разрешение выполняется, когда представление определено.

Laurenz Albe 16.09.2022 07:39

Другие вопросы по теме