Warum kann ich meine Tabelle (PostgreSQL) nicht sehen, wenn ich in psql \ dt (+) verwende?

12

Ich habe die Tabelle donorim Schema referencewie folgt erstellt:

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

Ich habe die Tabelle wie folgt ausgefüllt:

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;

Wenn ich renne:

\dt+ reference.*

In PSQL sehe ich die reference.donorTabelle:

                          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)

Aber wenn ich renne \dt+ donor*(oder \dt(+)) sehe ich die reference.donorTabelle nicht:

                          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)

Warum kann ich die reference.donorTabelle nur sehen, wenn ich renne \dt+ reference.*oder \dt+ *.donor?
Ich habe erwartet \dt(oder \dt+), dass es angezeigt wird, aber das tut es nicht.

Meine search_pathenthält das Schema referenceund der Benutzer postgreshat alle Berechtigungen für das Schema referenceund alle Tabellen im Schema wie folgt:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Zur Verdeutlichung habe ich zwei donorTabellen, aber sie befinden sich in zwei verschiedenen Schemata, dh oecd.donor& reference.donor. (Ich kann oecd.donorohne Probleme sehen, wenn ich \dt(+)in psql verwende).

Dw8547
quelle

Antworten:

11

Die Dokumentation zu psql erklärt:

Wenn der patternParameter vollständig weggelassen wird, zeigen die \dBefehle alle Objekte an, die im aktuellen Schemasuchpfad sichtbar sind. Dies entspricht der Verwendung *als Muster. (Ein Objekt wird als sichtbar bezeichnet, wenn sich sein enthaltendes Schema im Suchpfad befindet und kein Objekt desselben Typs und Namens im Suchpfad vorkommt . Dies entspricht der Aussage, dass auf das Objekt ohne explizites Schema mit Namen verwiesen werden kann Qualifikation.) Verwenden Sie *.*als Muster , um alle Objekte in der Datenbank unabhängig von der Sichtbarkeit anzuzeigen.

Meine kühne Betonung.
Offensichtlich hast du oecd_clvorher referencein deinem Suchpfad . Verwenden Sie dies für Ihren Zweck:

\dt *.donor*

Und du bekommst:

                          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
quelle
Ok ich verstehe. Dies ist ein Follow-up q: Wenn ich nicht wusste, dass eine Datenbank zwei Tabellen mit demselben Namen in zwei verschiedenen Schemata enthält und alle Tabellen in allen Schemata dieser Datenbank anzeigen möchte, gibt es einen psql-Metabefehl das wird sie alle anzeigen, unabhängig davon, welches Schema im search_pathersten platziert ist und ohne dass ich die Tabellen- / Schemanamen im Voraus kenne ? Oder bin ich besser abzufragen die information schemazB ,: SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;?
Dw8547
@ user4842454: Das Informationsschema weist eigene Einschränkungen auf. . Um alle Tabellen (einschließlich der Systemkataloge) anzuzeigen, verwenden Sie diese \dt *.*wie im Angebot angegeben.
Erwin Brandstetter
1

Der erste Befehl funktioniert, weil alle aufgelisteten Tabellen in ihrem Schema einen Verweis enthalten. Der zweite Befehl funktioniert genauso für 'donor'. Daher enthält die Beziehung "reference.iso_3166_1" keinen "Spender" im Namen. Wenn Sie iso_3166_1 auflisten möchten, versuchen Sie es einfach

    \dt+ iso*

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

Sahap Asci
quelle
Die Frage ist, warum der reference | donorbeim 2. Befehl nicht aufgeführt ist.
ypercubeᵀᴹ
@SahapAsci: Mein Hauptanliegen ist, warum \dt(oder \dt+) die Tabelle reference.donor nicht auflistet . Gemäß der Tabelle reference.iso_3166_1 ist alles in Ordnung.
Dw8547