Psql içinde \ dt (+) kullandığımda neden tablomu (PostgreSQL) göremiyorum?


12

donorŞemada göre tablo oluşturduk reference:

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

Ben göre tablo doldurdu:

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;

Koştuğumda:

\dt+ reference.*

psql içinde reference.donortabloyu görüyorum :

                          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)

Ama koştuğumda \dt+ donor*(ya da \dt(+)) reference.donormasayı görmüyorum :

                          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)

Neden sadece görebilirsiniz reference.donorkaçarsam tablo \dt+ reference.*veya \dt+ *.donor?
Ben göstermek için bekliyordum \dt(ya da \dt+), ama değil.

Benim search_pathşemayı içerir ve referencekullanıcı postgresşema referenceve şemadaki tüm tablolara göre tüm izinlere sahiptir :

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Sadece iki var netleştirmek için donormasalar, ancak iki farklı şemalar bulunmaktadır yani oecd.donor& reference.donor. (Ben psql içinde oecd.donorkullandığımda herhangi bir sorun olmadan görebilirsiniz \dt(+)).

Yanıtlar:


11

Psql ile ilgili belgeler şunları açıklar:

Her ne zaman patternparametresi tamamen atlanırsa, \dkomutlar geçerli şema arama yolunda görünür durumda olan tüm nesneleri göstermek - Bu kullanmakla eşdeğerdir *desen olarak. (Bir nesnenin, içerdiği şeması arama yolundaysa ve arama yolunda daha önce aynı tür ve adda hiçbir nesne görünmüyorsa görünür olduğu söylenir . Bu, nesneye açık şema olmadan ada göre başvurulabileceği ifadesine eşdeğerdir. Görünürlükten bağımsız olarak veritabanındaki tüm nesneleri görmek için *.*, desen olarak kullanın .

Cesur vurgu benim.
Açıkçası, sahip oecd_clönce referencesizin de arama yolu . Bunu amacınız için kullanın:

\dt *.donor*

Ve alacaksınız:

                          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)

Tamam anladım. Bu bir takip q: bir DB iki farklı şemalarda aynı ada sahip iki tablo olduğunu bilmiyordum ve bu DB tüm şemalarda tüm tabloları görmek istedim, bir psql meta komutu var mı search_pathilk olarak hangi şemanın yerleştirildiğine bakılmaksızın ve bence tablo / şema adlarını önceden bilmeden hepsini görüntüleyecek ? Yoksa information schemaörneğin sorgulamak daha iyi miyim , : SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;?
dw8547

@ user4842454: Bilgi şemasının kendi uyarıları var. . Tüm tabloları görmek için (sistem katalogları dahil) \dt *.*alıntıda belirtildiği şekilde kullanın.
Erwin Brandstetter

1

İlk komut, listelenen tüm tabloların şemalarında 'başvuru' olduğu için çalışır. İkinci komut 'donör' için aynı şekilde çalışır. dolayısıyla "reference.iso_3166_1" ilişkisinin adında "bağışçı" yoktur. iso_3166_1 listelemek istiyorsanız sadece deneyin

    \dt+ iso*

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


Soru, reference | donor2. komut ile neden listelenmediğidir.
ypercubeᵀᴹ

@SahapAsci: Benim asıl endişem referans.donor tablosunu neden \dt(veya \dt+) listelemediğidir. Tümü reference.iso_3166_1 tablosuna göre tamam.
dw8547
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.