PostgreSQL search_path изменение не работает как рекламируется - PullRequest
12 голосов
/ 13 сентября 2011

Я использую PostgreSQL 9.0.3 в RedHat. База данных содержит две схемы, public и wh. Я создал новую роль под названием django. Я хочу, чтобы этот пользователь использовал схему wh по умолчанию.

Следуя инструкции, я сделал:

ALTER USER django SET SEARCH_PATH TO wh, public;

Это похоже на работу:

SHOW SEARCH_PATH;
search_path 
-------------
wh, public

Однако, если я тогда сделаю \dt, отображаются только таблицы из общедоступной схемы. В руководстве изменение пути поиска должно иметь немедленный эффект, и я должен иметь возможность доступа к wh таблицам без префикса, но это не так. Вход и выход сохраняет изменения в search_path, но не показывает никаких изменений в поведении.

Чего мне не хватает?

Ответы [ 5 ]

14 голосов
/ 14 сентября 2011

Это может решить вашу проблему:

GRANT USAGE ON SCHEMA wh TO django;

(или ИСПОЛЬЗУЙТЕ ИСПОЛЬЗОВАНИЕ для любой роли, в которой django является (прямым или косвенным) участником.) (Или ВСЕ ... если это то, что вы хотите.)

Установка search_path предписывает Postgres искать объекты в перечисленных схемах. Он не дает разрешения увидеть, что там. Если у «django» нет необходимых привилегий, \dt не должен (и не должен) отображать эту информацию.

С другой стороны, если вы уже попробовали в качестве суперпользователя (согласно вашему комментарию к предыдущему предложению), то это может быть не так ...

1 голос
/ 14 сентября 2011

Я только что протестировал его (только выпускает) 9.1 в 64-битной Windows, и он работал как указано.

Выдержка из справочной страницы ALTER ROLE:

Остальные варианты изменяют значение по умолчанию сеанса роли для переменной конфигурации, либо для всех баз данных, либо, если указано условие IN DATABASE, только для сеансов в указанной базе данных.Всякий раз, когда роль запускает новый сеанс, указанное значение становится значением сеанса по умолчанию, переопределяя любой параметр, присутствующий в postgresql.conf или полученный из командной строки postgres. Это происходит только во время входа в систему ;выполнение SET ROLE или SET SESSION AUTHORIZATION не приводит к установке новых значений конфигурации.

( выделение шахты )

0 голосов
/ 16 апреля 2018

Для меня проблема была в том, что я пытался установить путь поиска в pgAdmin. По какой-то причине он не применял изменения к search_path. (Он продолжал устанавливать параметры в базе данных?)
Я вошел в систему через psql и выполнил те же самые команды, и это сработало. Может быть, я сделал что-то не так, но это может помочь другим, если они тоже что-то делают не так:)

0 голосов
/ 14 сентября 2011

Для PostgreSQL, если пользователь подключается к базе данных и ищет объекты, подобные таблице, сначала он ищет схему точно так же, как и имя пользователя, если не найден, он ищет общедоступную схему. В вашем случаеЕсли вы подключите базу данных через пользователя django, она по умолчанию будет искать схему django, но вы хотите, чтобы текущая схема была wh, поэтому сделайте имя схемы и имя роли одинаковыми, а затем войдите в базу данных, так как роль будетРешите проблему, не вводя префикс, просто попробуйте!

0 голосов
/ 14 сентября 2011

Это может быть ограничением команды \dt.

Чтобы убедиться, что search_path работает правильно, попробуйте запустить SELECT * FROM some_table, где some_table - это то, которое находится в схеме wh.

...