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?

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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.