Como os objetos no pg_catalog
esquema estão implicitamente nos search_path
( docs ), seria recomendável instalar extensões nesse esquema?
Como os objetos no pg_catalog
esquema estão implicitamente nos search_path
( docs ), seria recomendável instalar extensões nesse esquema?
Não instale extensões para pg_catalog
(a menos que é o seu padrão: muito poucas extensões são concebidos dessa forma), porque você não mexa com catálogo do sistema, sempre . @ Chris demonstra uma razão para isso. Há outros.
No entanto, o esquema "público" não é de forma alguma especial . É apenas o esquema padrão pré-instalado nas distribuições padrão, para que possamos começar imediatamente. Alguns administradores de banco de dados não usam o esquema "público", outros até o excluem.
CREATE EXTENSION
não é afiliado ao esquema "público". Ele é instalado no esquema atual, a menos que seja instruído de outra forma - exceto que algumas extensões têm um esquema predefinido (como PGQ / Londiste ). A documentação:
schema_name
O nome do esquema no qual instalar os objetos da extensão, uma vez que a extensão permite que seu conteúdo seja realocado. O esquema nomeado já deve existir. Se não especificado, e o arquivo de controle da extensão também não especificar um esquema, o esquema de criação de objeto padrão atual será usado .
Lembre-se de que a extensão em si não é considerada como estando em nenhum esquema: as extensões têm nomes não qualificados que devem ser exclusivos em todo o banco de dados. Mas objetos pertencentes à extensão podem estar dentro de esquemas.
Negrito ênfase minha.
Decida como gerenciar usuários, esquemas e search_path
:
Depois, decida onde instalar as extensões. Você pode instalar em qualquer esquema de sua escolha e incluir esse esquema no padrão search_path
para todos os usuários ou apenas para alguns ou nenhum usuário (para que sejam necessárias referências qualificadas). Tudo depende do que você deseja alcançar.
Faça o que fizer, fique consistente.
Eu gosto de instalar extensões (que permitem) em um esquema de "extensões" dedicado, que eu incluo no padrão search_path
depois de "public" (e "$ user" - se você usar isso). Ajuda com uma separação limpa de minhas próprias funções públicas e outros objetos públicos. Minha configuração em postgresql.conf
:
search_path = "$user",public,extensions
Ou:
search_path = public,extensions
E eu instalo extensões com:
CREATE EXTENSION some_extension SCHEMA extensions;
Uma coisa a ser observada: dessa forma, você pode "ocultar" objetos (não qualificados) no extensions
esquema atrás de objetos com o mesmo nome (e parâmetros) no public
esquema.
Relacionado:
plpgsql
extensão então de alguma forma uma exceção a esta regra? Cada instalação tenho visto tem esta extensão em pg_catalogIn PostgreSQL 9.0 and later, PL/pgSQL is installed by default. However it is still a loadable module, so especially security-conscious administrators could choose to remove it.
pg_catalog
. (Isso gera um erro se você tentar alterá-lo.) Esse talvez seja um padrão para instalar extensões de linguagem procedural para funções?A instalação de extensões no
pg_catalog
, até onde sei, não é aconselhável. Você deve usar opublic
esquema padrão , que também está nosearch_path
padrão.Por quê?
Como exemplo, trabalharei com a
pageinspect
extensão que eu já criei nopublic
esquema. Todas as funções são, por padrão, acessíveis a todos os esquemas no banco de dados, se estiverem localizadas nopublic
esquema.Agora, tento movê-lo para o
pg_catalog
esquema, usandoe funciona muito bem.
Mas...
Tente movê-lo novamente, de volta ao
public
esquema usandoe não permitirá, produzindo o seguinte erro
Oh! Bem, tudo bem que não me deixe mexer. Posso recuperá-lo novamente no
public
esquema, soltando-o e recriando, certo? ...Tudo bem. De volta ao lugar certo no
public
esquema, e as funções ainda estão acessíveis a todos os esquemas no banco de dados.TL, DR; Basta usar o
public
esquema padrão para extensões.fonte