Por que não consigo ver minha tabela (PostgreSQL) quando uso \ dt (+) dentro do psql?

12

Eu criei a tabela donorno esquema referenceconforme:

CREATE TABLE reference.donor (
    donor_code smallint PRIMARY KEY,
    donor_name character varying NOT NULL,
    donor_type smallint REFERENCES reference.donor_type (type_id),
    alpha_2_code char(2) REFERENCES reference.iso_3166_1 (alpha_2_code)
);

Eu preenchi a tabela conforme:

INSERT INTO reference.donor (donor_code, donor_name, donor_type, alpha_2_code)
SELECT donor_code, donor_name, donor_type, alpha_2_code
FROM reference.donor_template;

Quando eu corro:

\dt+ reference.*

dentro do psql vejo a reference.donortabela:

                          List of relations
  Schema   |      Name      | Type  |  Owner   | Size  | Description 
-----------+----------------+-------+----------+-------+-------------
 reference | donor          | table | postgres | 16 kB | 
 reference | donor_template | table | postgres | 16 kB | 
 reference | donor_type     | table | postgres | 16 kB | 
 reference | iso_3166_1     | table | postgres | 48 kB | 
(4 rows)

Mas quando eu corro \dt+ donor*(ou \dt(+)) não vejo a reference.donortabela:

                          List of relations
  Schema   |      Name      | Type  |  Owner   | Size  | Description 
-----------+----------------+-------+----------+-------+-------------
 oecd_cl   | donor          | table | postgres | 16 kB | 
 reference | donor_template | table | postgres | 16 kB | 
 reference | donor_type     | table | postgres | 16 kB | 
(3 rows)

Por que só posso ver a reference.donortabela se corro \dt+ reference.*ou \dt+ *.donor?
Eu esperava \dt(ou \dt+) exibi-lo, mas não mostra.

My search_pathinclui o esquema referencee o usuário postgrestem todas as permissões no esquema referencee todas as tabelas no esquema conforme:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Só para esclarecer, tenho duas donortabelas, mas elas estão em dois esquemas diferentes, ou seja, oecd.donor& reference.donor. (Eu posso ver oecd.donorsem problemas quando eu uso \dt(+)dentro do psql).

dw8547
fonte

Respostas:

11

A documentação no psql explica:

Sempre que o patternparâmetro é omitido completamente, os \dcomandos exibem todos os objetos visíveis no caminho de pesquisa do esquema atual - isso é equivalente ao uso *como padrão. (Um objeto é considerado visível se o seu esquema contido estiver no caminho de pesquisa e nenhum objeto do mesmo tipo e nome aparecer anteriormente no caminho de pesquisa . Isso é equivalente à afirmação de que o objeto pode ser referenciado por nome sem esquema explícito qualificação.) Para ver todos os objetos no banco de dados, independentemente da visibilidade, use *.*como padrão.

Negrito ênfase minha.
Obviamente, você tem oecd_clantes referenceno seu caminho de pesquisa . Use isto para seu propósito:

\dt *.donor*

E você terá:

                          List of relations
  Schema   |      Name      | Type  |  Owner   | Size  | Description 
-----------+----------------+-------+----------+-------+-------------
 oecd_cl   | donor          | table | postgres | 16 kB | 
 reference | donor          | table | postgres | 16 kB | 
 reference | donor_template | table | postgres | 16 kB | 
 reference | donor_type     | table | postgres | 16 kB | 
(4 rows)
Erwin Brandstetter
fonte
Ok, eu entendi. Este é um acompanhamento q: se eu não sabia que existem duas tabelas com o mesmo nome em dois esquemas diferentes em um banco de dados e queria ver todas as tabelas em todos os esquemas nesse banco de dados, existe um comando meta do psql isso exibirá todos eles, independentemente de qual esquema seja colocado no search_pathprimeiro e sem que eu saiba os nomes da tabela / esquema com antecedência? Ou eu sou melhor de consultar o information schemaexemplo ,: SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;?
dw8547
@ user4842454: O esquema de informações possui suas próprias advertências. . Para ver todas as tabelas (incluindo os catálogos do sistema), use \dt *.*as instruções na cotação.
Erwin Brandstetter
1

O primeiro comando funciona porque todas as tabelas listadas têm 'referência' em seu esquema. O segundo comando funciona da mesma forma para 'doador'. portanto, a relação "reference.iso_3166_1" não possui nenhum 'doador' em seu nome. se você quiser listar iso_3166_1, tente

    \dt+ iso*

ref: http://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-PATTERNS

Sahap Asci
fonte
A questão é por que o reference | donornão está listado com o segundo comando.
precisa saber é o seguinte
@SahapAsci: minha principal preocupação é por que \dt(ou \dt+) não lista a tabela reference.donor. Tudo está OK conforme a tabela reference.iso_3166_1.
precisa saber é o seguinte