Dlaczego nie widzę mojej tabeli (PostgreSQL), gdy używam \ dt (+) w psql?

12

Utworzyłem tabelę donorw schemacie referencezgodnie z:

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

Wypełniłem tabelę zgodnie z:

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;

Kiedy biegnę:

\dt+ reference.*

wewnątrz psql widzę reference.donortabelę:

                          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)

Ale kiedy uruchamiam \dt+ donor*(lub \dt(+)) nie widzę reference.donortabeli:

                          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)

Dlaczego mogę zobaczyć reference.donortabelę tylko po uruchomieniu \dt+ reference.*lub \dt+ *.donor?
Spodziewałem się \dt(lub \dt+) go wyświetlić, ale tak nie jest.

Mój search_pathobejmuje schemat, referencea użytkownik postgresma wszystkie uprawnienia do schematu referencei wszystkich tabel w schemacie zgodnie z:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Aby wyjaśnić, mam dwie donortabele, ale są one w dwóch różnych schematach, tj . oecd.donor& reference.donor. (Widzę oecd.donorbez żadnych problemów, gdy korzystam z \dt(+)psql).

dw8547
źródło

Odpowiedzi:

11

Dokumentacja na psql wyjaśnia:

Ilekroć patternparametr zostanie całkowicie pominięty, \dpolecenia wyświetlają wszystkie obiekty widoczne w bieżącej ścieżce wyszukiwania schematu - jest to równoważne z użyciem *jako wzorca. (Mówi się, że obiekt jest widoczny, jeśli jego zawierający schemat znajduje się na ścieżce wyszukiwania i żaden obiekt tego samego rodzaju i nazwy nie pojawia się wcześniej na ścieżce wyszukiwania . Jest to równoważne stwierdzeniu, że do obiektu można się odwoływać według nazwy bez wyraźnego schematu kwalifikacja.) Aby zobaczyć wszystkie obiekty w bazie danych niezależnie od widoczności, użyj *.*jako wzorca.

Odważny nacisk moje.
Oczywiście masz oecd_clwcześniej referencena swojej ścieżce wyszukiwania . Wykorzystaj to do swoich celów:

\dt *.donor*

I dostaniesz:

                          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
źródło
Ok, rozumiem. Jest to kontynuacja q: jeśli nie wiedziałem, że istnieją dwie tabele o tej samej nazwie w dwóch różnych schematach w bazie danych i chciałem zobaczyć wszystkie tabele we wszystkich schematach w tej bazie danych, czy istnieje meta polecenie psql które wyświetlą je wszystkie, niezależnie od tego, który schemat zostanie umieszczony w search_pathpierwszej kolejności i bez mojej wcześniejszej znajomości nazw tabel / schematów? A może lepiej zapytać information schemanp .: SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;?
dw8547,
@ user4842454: Schemat informacyjny ma swoje własne zastrzeżenia. . Aby zobaczyć wszystkie tabele (w tym katalogi systemowe), skorzystaj z \dt *.*instrukcji w cytacie.
Erwin Brandstetter,
1

Pierwsze polecenie działa, ponieważ wszystkie wymienione tabele mają „odwołanie” w schemacie. Drugie polecenie działa tak samo dla „dawcy”. więc relacja „referencja.iso_3166_1” nie ma w nazwie żadnego „dawcy”. jeśli chcesz wyświetlić listę iso_3166_1, po prostu spróbuj

    \dt+ iso*

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

Sahap Asci
źródło
Pytanie brzmi, dlaczego reference | donornie ma go na liście z drugim poleceniem.
ypercubeᵀᴹ
@SahapAsci: moja główna obawa dotyczy tego, dlaczego \dt(lub \dt+) nie wyświetla tabeli referencji.donor. Wszystko jest w porządku zgodnie z tabelą reference.iso_3166_1.
dw8547,