search_path

Тема дорожной карты · PostgreSQL

Параметр search_path в PostgreSQL управляет порядком, в котором выполняется поиск схем при встрече в запросе неквалифицированного имени объекта (таблицы, функции, типа); он функционирует аналогично переменной PATH в операционных системах. По умолчанию search_path установлен в "$user", public: PostgreSQL сначала ищет в схеме с именем текущей роли, а затем в схеме public. Администраторы баз данных устанавливают search_path на уровне базы данных (ALTER DATABASE db SET search_path = ...), уровне роли (ALTER ROLE role SET search_path = ...) или уровня сеанса (SET search_path = schema1, schema2), чтобы управлять разрешением имён и поддерживать многоарендные конструкции баз данных. Неправильно настроенный search_path может привести к уязвимостям захвата функций: злоумышленник, способный создавать объекты в схеме, стоящей раньше в пути, может заменить доверенные функции, поэтому функции, выполняемые с повышенными привилегиями, должны использовать полностью квалифицированные имена или явно задавать search_path в своём определении. Тщательное управление search_path — фундаментальная практика администрирования баз данных PostgreSQL как с точки зрения безопасности, так и корректности в многосхемных развёртываниях.

Как это работает

search_path организует данные иерархически: кластер → БД → схема → объект (таблица, view, функция). Дефолтная схема — public; можно создать app, analytics, staging для пространств имён. search_path контролирует, по каким схемам ищутся неполные имена. Cross-database запросы НЕ разрешены (используйте foreign data wrappers); cross-schema — бесшовны. Роли (юзеры + группы) владеют объектами; права каскадятся через GRANT/REVOKE.

Когда применять

Схемы — для пространств имён логических модулей одного приложения (auth.users, billing.invoices): держит монолитную БД организованной без раздела на отдельные. Отдельные БД — для настоящего tenancy или полностью независимых приложений. Создавайте выделенную роль на каждый сервис (auth_service, billing_service); никогда не гоняйте под superuser postgres.

Типичные ошибки

Ловушки search_path: всё в public и через 3 года клубок прав; широкие права на public в 15+ БД ("дефолт с давних пор" — security exposure); забыли search_path в скриптах (запросы ломаются непредсказуемо в зависимости от сессии). \dn периодически — для аудита разрастания схем.

Связанные понятия

Полезные ресурсы