Perché non riesco a vedere la mia tabella (PostgreSQL) quando uso \ dt (+) all'interno di psql?


12

Ho creato la tabella donornello schema referencesecondo:

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

Ho popolato la tabella secondo:

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 corro:

\dt+ reference.*

all'interno di psql vedo la reference.donortabella:

                          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)

Ma quando corro \dt+ donor*(o \dt(+)) non vedo la reference.donortabella:

                          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)

Perché posso vedere la reference.donortabella solo se corro \dt+ reference.*o \dt+ *.donor?
Mi aspettavo \dt(o \dt+) di visualizzarlo, ma non lo fa.

Il mio search_pathinclude lo schema referencee l'utente postgresha tutte le autorizzazioni sullo schema referencee tutte le tabelle nello schema secondo:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Giusto per chiarire, ho due donortabelle, ma sono in due schemi diversi, ad esempio, oecd.donor& reference.donor. (Riesco a vedere oecd.donorsenza problemi quando uso \dt(+)all'interno di psql).

Risposte:


11

La documentazione su psql spiega:

Ogni volta che il patternparametro viene omesso completamente, i \dcomandi visualizzano tutti gli oggetti che sono visibili nel percorso di ricerca dello schema corrente - ciò equivale a utilizzare *come modello. (Si dice che un oggetto è visibile se il suo schema di contenimento si trova nel percorso di ricerca e nessun oggetto dello stesso tipo e nome appare prima nel percorso di ricerca . Ciò equivale all'affermazione secondo cui l'oggetto può essere referenziato per nome senza schema esplicito qualifica.) Per vedere tutti gli oggetti nel database indipendentemente dalla visibilità, utilizzare *.*come modello.

Enorme enfasi sulla mia.
Ovviamente, è necessario oecd_cl, prima referencenel vostro percorso di ricerca . Usa questo per il tuo scopo:

\dt *.donor*

E otterrai:

                          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)

Ok ho capito. Questo è un follow-up q: se non sapevo che ci sono due tabelle con lo stesso nome in due diversi schemi in un DB e volevo vedere tutte le tabelle in tutti gli schemi in questo DB, c'è un metafile psql che li visualizzerà tutti, indipendentemente da quale schema è posizionato nel search_pathprimo e senza che io conosca in anticipo i nomi di tabella / schema? O sono io meglio di interrogare il information schemaad esempio ,: SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;?
dw8547

@ user4842454: lo schema informativo ha le proprie avvertenze. . Per vedere tutte le tabelle (compresi i cataloghi di sistema) utilizzare \dt *.*come indicato nel preventivo.
Erwin Brandstetter,

1

Il primo comando funziona perché tutte le tabelle elencate hanno 'riferimento' nel loro schema. Il secondo comando funziona allo stesso modo per "donatore". pertanto la relazione "reference.iso_3166_1" non ha alcun "donatore" nel suo nome. se vuoi elencare iso_3166_1 allora prova

    \dt+ iso*

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


La domanda è: perché reference | donornon è elencato con il 2o comando.
ypercubeᵀᴹ

@SahapAsci: la mia preoccupazione principale è perché \dt(o \dt+) non elenca la tabella reference.donor. Tutto è OK secondo la tabella reference.iso_3166_1.
dw8547
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.