Что такое путь_поиска для данной базы данных и пользователя?

44

Я могу видеть ток search_pathс:

show search_path ;

И я могу установить search_pathдля текущего сеанса с:

set search_path = "$user", public, postgis;

Кроме того, я могу навсегда установить search_pathдля данной базы данных с помощью:

alter database mydb set search_path = "$user", public, postgis ;

И я могу навсегда установить search_pathдля данной роли (пользователя) с помощью:

alter role johnny set search_path = "$user", public, postgis ;

Но я хотел бы знать, как определить параметры базы данных и роли (относительно search_path) до их изменения?

user664833
источник

Ответы:

36

Вы можете найти параметры конфигурации для ролей и баз данных в таблице каталога pg_db_role_setting.

Этот запрос извлекает любые настройки для данной роли или базы данных:

SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'myrole' OR d.datname = 'mydb';

Если ничего не задано, следующий нижний экземпляр определяет состояние по умолчанию для параметра search_path, которое postgresql.confв этом случае или параметры командной строки при запуске сервера. Связанный:

Чтобы отменить любые настройки роли или базы данных - search_pathв этом конкретном примере:

ALTER ROLE myrole RESET search_path;

Или:

ALTER DATABASE mydb RESET search_path;

Или:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

Никогда не манипулируйте данными в системном каталоге ( pg_catalog.*) вручную. Используйте команды DDL, как указано в руководстве для ALTER ROLEи ALTER DATABASE.
По сути, RESETкоманда удаляет строку, pg_db_role_settingчтобы базовые настройки снова вступили в силу. Я бы не назвал это запутанным.

Эрвин Брандштеттер
источник
Вау. Я не предполагал, что это будет так запутанно. Как бы вы сбросили заданную базу данных и настройки роли ? После выполнения alter role myrole set search_path = "$user", public, postgis ;я заметил, что pg_roles.rolconfig(в соответствии с моей ролью) получил значение {"search_path=\"$user\", public, postgis"}. Также select * from pg_db_role_setting ;теперь отображается дополнительная строка. И после выполнения alter database mydb set search_path = "$user", public, postgis ;я вижу соответствующую строку в select * from pg_db_role_setting ;- в конце я не уверен, как "отменить" эти изменения.
user664833
@ user664833: я добавил инструкции для сброса.
Эрвин Брандштеттер
6

Постоянные настройки для баз данных и ролей хранятся в системной таблице pg_db_role_settings .

Только измененные настройки присутствуют. Если путь поиска никогда не изменялся для базы данных или роли, я предполагаю, что это можно предположить "$user",public.

  • Значение параметра до любого изменения, в том числе на уровне кластера (через глобальную конфигурацию postgresql.conf), можно запросить из базы данных с помощью:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • Значение параметра до любого изменения в сеансе (через SETкоманду) можно запросить из базы данных с помощью:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • Когда для него установлено значение, отличное от значения по умолчанию postgresql.conf, получить это значение в SQL не просто, независимо от текущего сеанса . pg_settings.boot_valне будет делать, потому что он игнорирует изменения в файле конфигурации, и pg_settings.reset_valне будет, потому что на него влияют параметры базы данных / пользователя, которые могут быть установлены через ALTER USER/ALTER DATABASE. Простейший способ получить это значение для администратора базы данных - просто просмотреть его postgresql.conf. В противном случае см. Сброс search_path к глобальному кластерному значению по умолчанию, которое подробно описывает эту тему.

Даниэль Верите
источник
Разве на boot_valсамом деле не скомпилировано заводское значение по умолчанию, а не настройка postgresql.conf?
Эрвин Брандштеттер
@ Эрвин: да. Можно хотеть смотреть reset_valвместо boot_val.
Даниэль Верите
Хм, настройки базы данных или роли перезаписывают значение в reset_val. Я наткнулся на этот старый вопрос, исследуя этот недавний вопрос: dba.stackexchange.com/questions/145280/…
Эрвин Брандштеттер
@Erwin: ISTM, что получение значения из postgresql.conf, скорее всего, будет проблемой XY в большинстве случаев. Во всяком случае, я отредактировал ответ, чтобы связать его с новым вопросом и немного расширить.
Даниэль Верите
3
select * from pg_user;

Правда для Postgres и Redshift. Это кажется слишком простым по сравнению с предыдущими ответами, от которых зависит pg_db_role_setting, но в useconfigстолбце будет список пользовательских настроек, в том числе search_path, отформатированный в виде списка.

pg_user Документация Postgres находится здесь

Чтобы быть более избирательным:

rs.db.batarang.com cooldb:cooldude =#> select usename
                                              , useconfig 
                                       from   pg_user
                                       where  usename = 'cooldude';
┌────────────┬─────────────────────────────────────────────────────┐
  usename                         useconfig                      
├────────────┼─────────────────────────────────────────────────────┤
 cooldude    {"search_path=dirt, test, \"$user\", public, prod"} 
└────────────┴─────────────────────────────────────────────────────┘

Я думаю, что эта таблица пользователей содержит всех пользователей в кластере, а не только конкретные базы данных - но я не проверял это.

Мерлин
источник
Роль не такая же, как у пользователя. ;)
Вик
Вик, не могли бы вы уточнить? Документ Postgres лаконичен и, кажется, говорит, что пользователь и роль больше не являются отдельными понятиями, но я не администратор баз данных и хотел бы получить больше информации. postgresql.org/docs/current/static/user-manag.html
Мерлин
2
Любая «роль» может выступать в роли пользователя, группы или обоих. Но у пользователя есть еще одно отличие. Просматривая каталог, мы видим, что представления pg_role и pg_user ссылаются на таблицу pg_authid, но с предикатом rolcanlogin для пользователей. «Пользователи» могут войти в вашу базу данных, и, как правило, «роли» определяют наборы полномочий, которые наследуют пользователи.
Вик