5.7.3. O Caminho de Pesquisa de Esquemas
Nomes qualificados são tediosos de escrever, e é melhor não rebocar um determinado nome de esquema em aplicações de qualquer forma. Portanto, tabelas são frequentemente referidas por nomes não-qualificados, que consistem apenas no nome da tabela. O sistema determina qual tabela se destina a seguir um caminho de pesquisa, que é uma lista de esquemas para procurar. A primeira tabela correspondente no caminho de pesquisa é considerada como sendo a desejada. Se não houver correspondência no caminho de pesquisa, um erro é reportado, mesmo que existam nomes de tabelas correspondentes em outros esquemas no banco de dados.
A capacidade de criar objetos com nomes semelhantes em esquemas diferentes complica a escrita de uma consulta que referencia precisamente os mesmos objetos todas as vezes. Também abre o potencial para usuários alterarem o comportamento de consultas de outros usuários, de forma maliciosa ou acidental. Devido à prevalência de nomes não qualificados em consultas e seu uso em PostgreSQLinternals, adicionar um esquema para search_patheffectively confia em todos os usuários que têm CRIAR privilégio sobre esse esquema. Quando você executa uma consulta comum, o usuário amalicioso capaz de criar objetos em um esquema do seu caminho de pesquisa pode assumir o controle e executar funções SQL arbitrárias como se você as executasse.
O primeiro esquema nomeado no caminho de pesquisa é chamado de currentchema. Além de ser o primeiro esquema pesquisado, é também o esquema em que novas tabelas serão criadas se o comando CREATE TABLE não especificar um schemaname.
Para mostrar o caminho de pesquisa atual, use o seguinte comando:
SHOW search_path;
Na configuração padrão isto retorna:
search_path-------------- "$user",public
O primeiro elemento especifica que um esquema com o mesmo nome do usuário atual deve ser pesquisado. Se tal esquema não existir, a entrada é ignorada. O segundo elemento refere-se ao schemathat público que já vimos.
O primeiro esquema no caminho de pesquisa que existe é a localização padrão para a criação de novos objetos. Esta é a razão pela qual os objectos por defeito são criados no esquema público. Quando objetos arereferenciados em qualquer outro contexto sem qualificação de esquema (modificação de tabela, modificação de dados ou comandos de consulta), o caminho de pesquisa é percorrido até que um objeto correspondente seja encontrado. Portanto, na configuração predefinida, qualquer acesso não qualificado novamente só pode se referir ao esquema público.
Para colocar nosso novo esquema no caminho, usamos:
SET search_path TO myschema,public;
(Omitimos aqui o $user porque não temos necessidade imediata dele.) E então podemos acessar a tabela com a qualificaçãooutschema:
DROP TABLE mytable;
Também, como myschema é o primeiro elemento no caminho, novos objetos seriam por padrão criados init.
Também poderíamos ter escrito:
SET search_path TO myschema;
Então não temos mais acesso ao esquema público com a qualificaçãooutexplicit. Não há nada de especial no esquema público, exceto que ele existe por padrão. Ele pode ser descartado,também.
Ver também a Secção 9.25 para outras formas de manipulação do caminho de pesquisa do esquema.
O caminho de pesquisa funciona da mesma forma para nomes de tipos de dados, nomes de funções, e nomes de operadores como funciona para nomes de tabelas. Os nomes dos tipos de dados e das funções podem ser qualificados exatamente da mesma forma que os nomes das tabelas. Se você precisar escrever um nome de operador qualificado em anexação, há uma provisão especial: você deve escrever
OPERATOR(schema.operator)
Isso é necessário para evitar ambiguidade sintática. Um exemplo é:
SELECT 3 OPERATOR(pg_catalog.+) 4;
Na prática, geralmente se confia no caminho de busca dos operadores, para não ter que escrever nada tão feio como isso.