Mengapa saya tidak bisa melihat meja saya (PostgreSQL) ketika saya menggunakan \ dt (+) di dalam psql?


12

Saya telah membuat tabel donordalam skema referencesesuai:

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

Saya telah mengisi tabel sesuai:

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;

Ketika saya menjalankan:

\dt+ reference.*

di dalam psql saya melihat 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)

Tetapi ketika saya menjalankan \dt+ donor*(atau \dt(+)) saya tidak melihat reference.donortabel:

                          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)

Mengapa saya hanya bisa melihat reference.donortabel jika saya menjalankan \dt+ reference.*atau \dt+ *.donor?
Saya mengharapkan \dt(atau \dt+) untuk menampilkannya, tetapi tidak.

Saya search_pathmenyertakan skema reference& pengguna postgresmemiliki semua izin pada skema referencedan semua tabel dalam skema sesuai:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Hanya untuk mengklarifikasi, saya punya dua donortabel, tetapi mereka berada di dua skema yang berbeda yaitu, oecd.donor& reference.donor. (Saya bisa melihat oecd.donortanpa masalah ketika saya menggunakan \dt(+)di dalam psql).

Jawaban:


11

Dokumentasi tentang psql menjelaskan:

Setiap kali patternparameter dihilangkan sepenuhnya, \dperintah menampilkan semua objek yang terlihat di jalur pencarian skema saat ini - ini setara dengan menggunakan *sebagai pola. (Suatu objek dikatakan terlihat jika mengandung skema di jalur pencarian dan tidak ada objek dengan jenis dan nama yang sama muncul sebelumnya di jalur pencarian . Ini setara dengan pernyataan bahwa objek dapat direferensikan dengan nama tanpa skema eksplisit kualifikasi.) Untuk melihat semua objek dalam basis data terlepas dari visibilitas, gunakan *.*sebagai pola.

Penekanan berani saya.
Jelas, yang Anda miliki oecd_clsebelumnya referencedi jalur pencarian Anda . Gunakan ini untuk tujuan Anda:

\dt *.donor*

Dan Anda akan mendapatkan:

                          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 saya mengerti. Ini adalah tindak lanjut q: jika saya tidak tahu bahwa ada dua tabel dengan nama yang sama dalam dua skema berbeda dalam DB dan ingin melihat semua tabel di semua skema dalam DB ini, apakah ada perintah meta psql meta yang akan menampilkan semuanya, terlepas dari skema mana yang ditempatkan di yang search_pathpertama dan tanpa saya mengetahui tabel / nama skema di muka? Atau apakah saya lebih baik bertanya information schemamisalnya ,: SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;?
dw8547

@ user4842454: Skema informasi memiliki peringatan itu sendiri. . Untuk melihat semua tabel (termasuk katalog sistem) gunakan \dt *.*seperti yang diperintahkan dalam kutipan.
Erwin Brandstetter

1

Perintah pertama berfungsi karena semua tabel yang tercantum memiliki 'referensi' dalam skema mereka. Perintah kedua bekerja sama untuk 'donor'. jadi relasi "reference.iso_3166_1" tidak memiliki 'donor' dalam namanya. jika Anda ingin mencantumkan iso_3166_1 maka coba saja

    \dt+ iso*

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


Pertanyaannya adalah mengapa reference | donortidak terdaftar dengan perintah ke-2.
ypercubeᵀᴹ

@SahapAsci: perhatian utama saya adalah mengapa \dt(atau \dt+) tidak mencantumkan tabel reference.donor. Semua baik-baik saja sesuai tabel reference.iso_3166_1.
dw8547
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.