Qual é o caminho de pesquisa para um determinado banco de dados e usuário?

44

Eu posso ver a corrente search_pathcom:

show search_path ;

E eu posso definir o search_pathpara a sessão atual com:

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

Também posso definir permanentemente o search_pathpara um determinado banco de dados com:

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

E posso definir permanentemente o search_pathpara uma determinada função (usuário) com:

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

Mas eu gostaria de saber como determinar quais são as configurações de banco de dados e função (em relação a search_path) antes de alterá-las?

user664833
fonte

Respostas:

36

Você pode encontrar definições de configuração para funções e bancos de dados na tabela de catálogo pg_db_role_setting.

Esta consulta recupera todas as configurações para uma determinada função ou banco de dados:

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';

Se nada estiver definido, a próxima instância inferior determinará o estado padrão do search_path, que é postgresql.confneste caso ou as opções de linha de comando no início do servidor. Relacionado:

Para resetar todas as configurações de um papel ou banco de dados - o search_pathneste exemplo em particular:

ALTER ROLE myrole RESET search_path;

Ou:

ALTER DATABASE mydb RESET search_path;

Ou:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

Nunca manipule dados no catálogo do sistema ( pg_catalog.*) manualmente. Use os comandos DDL conforme as instruções no manual para ALTER ROLEe ALTER DATABASE.
Essencialmente, o RESETcomando exclui uma linha de pg_db_role_settingpermitir que a configuração base entre em vigor novamente. Eu não chamaria isso de complicado.

Erwin Brandstetter
fonte
Uau. Eu não imaginava que isso seria complicado. Como você desmarca um determinado banco de dados e configuração de função ? Após a execução alter role myrole set search_path = "$user", public, postgis ;, notei que pg_roles.rolconfig(correspondendo ao meu papel) obtive o valor {"search_path=\"$user\", public, postgis"}. Além disso, select * from pg_db_role_setting ;agora mostra uma linha adicional. E depois da execução alter database mydb set search_path = "$user", public, postgis ;, vejo uma linha correspondente select * from pg_db_role_setting ;- no final, não tenho certeza de como "desfazer" essas alterações.
precisa saber é o seguinte
@ user664833: adicionei instruções para cancelar a configuração.
Erwin Brandstetter
6

As configurações permanentes para bancos de dados e funções são armazenadas na tabela de todo o cluster do sistema pg_db_role_settings .

Somente configurações alteradas estão presentes. Se o caminho de pesquisa nunca foi modificado para um banco de dados ou uma função, acho que pode ser "$user",public.

  • O valor da configuração antes de qualquer alteração, inclusive no nível do cluster (por meio da configuração global postgresql.conf), pode ser consultado no banco de dados com:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • O valor da configuração anterior a qualquer alteração na sessão (por meio do SETcomando) pode ser consultado no banco de dados com:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • Quando é definido um valor não padrão postgresql.conf, não é fácil obter esse valor no SQL independentemente da sessão atual . pg_settings.boot_valnão funciona porque ignora alterações no arquivo de configuração e pg_settings.reset_valtambém não, porque é influenciado pelas configurações de banco de dados / usuário potencialmente definidas ALTER USER/ALTER DATABASE. A maneira mais simples de um DBA obter o valor é apenas pesquisá-lo postgresql.conf. Caso contrário, consulte Redefinir o caminho da pesquisa para o padrão global do cluster, que aborda este tópico em detalhes.

Daniel Vérité
fonte
Não é boot_valrealmente o padrão de fábrica compilado, não é a configuração postgresql.conf?
Erwin Brandstetter
@ Erwin: sim. Alguém pode querer olhar em reset_valvez de boot_val.
Daniel Vérité
Hmm, as configurações de banco de dados ou função substituem o valor em reset_val. Me deparei com essa questão de idade pesquisando este recente: dba.stackexchange.com/questions/145280/...
Erwin Brandstetter
@ Erwin: ISTM que obter o valor do postgresql.conf provavelmente é um problema XY na maioria dos casos. Enfim, editei a resposta para criar um link para a pergunta mais recente e expandir um pouco.
Daniel Vérité
3
select * from pg_user;

Verdadeiro para postgres e Redshift. Isso parece simples demais em comparação com as respostas anteriores das quais dependem pg_db_role_setting, mas a useconfigcoluna terá uma lista de configurações do usuário search_path, incluindo , formatada como uma lista.

pg_user A documentação do Postgres está aqui

Para ser mais seletivo:

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"} 
└────────────┴─────────────────────────────────────────────────────┘

Acho que esta tabela de usuários contém todos os usuários do cluster, não apenas o banco de dados específico - mas não verifiquei isso.

Merlin
fonte
A função não é exatamente a mesma do usuário. ;)
Vic
Vic você poderia elaborar? O documento do Postgres é sucinto e parece dizer que usuário e função não são mais conceitos distintos, mas eu não sou um DBA e gostaria de mais informações. postgresql.org/docs/current/static/user-manag.html
Merlin
2
Qualquer 'papel' pode atuar como usuário, grupo ou ambos. Mas um usuário está implicado em ter outra distinção. Revendo o catálogo, vemos que as visualizações pg_role e pg_user referenciam a tabela pg_authid, mas com o predicado rolcanlogin para usuários. 'Usuários' podem fazer login no seu banco de dados e geralmente 'funções' definem conjuntos de autorização que os usuários herdam.
Vic