Будет ли добавление префикса схемы к хранимой процедуре также ограничивать область действия всех процедур, вызываемых внутри нее, этой схемой?
Примите во внимание следующий сценарий:
Скажем, у меня есть хранимая процедура 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, что произойдет в этом сценарии? Будет ли родительский процесс с префиксом охватывать представления этой схемой?





Из мануала:
search_path (строка) Эта переменная определяет порядок, в котором схемы ищутся, когда объект (таблица, тип данных, функция и т. на него ссылается простое имя без указания схемы. Когда там объекты с одинаковыми именами в разных схемах, найденный используется первый в пути поиска. Объект, которого нет ни в одном из на схемы в пути поиска можно ссылаться, только указав их содержащий схему с квалифицированным (точечным) именем.
Это означает, что любой вызов процедуры без квалификации схемы найдет (или не найдет) только ту процедуру, которая находится в общедоступной схеме. Потому что public находится в вашем пути поиска по умолчанию.
Я всегда использую только public по умолчанию, остальное использует квалификацию схемы.
Если вы ссылаетесь на один объект, используя схему, это не меняет того факта, что все неквалифицированные ссылки используют search_path для определения схемы. Итак, если вы
CALL schemaa.parentproc();
но search_path есть schemab, процедура все равно будет вызывать процедуры из schemab.
То же самое относится к представлениям или всем другим объектам, но обратите внимание, что объекты, на которые есть ссылки внутри представления, зависят не от настройки search_path, когда представление используется, а от настройки search_path, когда представление было определено. Это связано с тем, что определяющий запрос анализируется во время создания представления и сохраняется в проанализированном виде.
есть ли способ увидеть проанализированное представление?
Да, загляните в pg_rewrite.
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... однако это, похоже, имеет чистый эффект вызова представления из публики, если представление внутри процедуры не квалифицировано
Зависит от того, как вы определили представление...
хм... в случае запуска миграции для другой схемы представление будет ограничено этой схемой, но затем вызов представления без префикса из процедуры с префиксом снова попытается вызвать общедоступный
Да. Объекты, на которые ссылаются в представлении, никогда не зависят от вашего текущего search_path. Разрешение выполняется, когда представление определено.
означает, что квалификация в parentProc с использованием
dbo.parentprocне имеет значения, если дочерняя схема не квалифицирована явно?