ทำไมฉันไม่เห็นตารางของฉัน (PostgreSQL) เมื่อฉันใช้ \ dt (+) ภายใน psql


12

ฉันได้สร้างตารางdonorในสคีมา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)
);

ฉันเติมตารางตาม:

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;

เมื่อฉันวิ่ง:

\dt+ reference.*

ภายใน psql ฉันเห็นreference.donorตาราง:

                          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)

แต่เมื่อฉันเรียกใช้\dt+ donor*(หรือ\dt(+)) ฉันไม่เห็นreference.donorตาราง:

                          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)

เหตุใดฉันจึงเห็นเพียงreference.donorตารางถ้าผมทำงาน\dt+ reference.*หรือ\dt+ *.donor?
ฉันคาดหวัง\dt(หรือ\dt+) ที่จะแสดง แต่ไม่ได้

ฉันsearch_pathรวม schema reference& ผู้ใช้postgresมีสิทธิ์ทั้งหมดใน schema referenceและตารางทั้งหมดใน schema ตาม:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

เพียงชี้แจงฉันมีสองdonorตาราง แต่พวกเขาอยู่ในสอง schemas ที่แตกต่างกันเช่น, และoecd.donor reference.donor(ฉันสามารถเห็นoecd.donorไม่มีปัญหาใด ๆ เมื่อฉันใช้\dt(+)ภายใน psql)

คำตอบ:


11

เอกสารเกี่ยวกับ psql อธิบาย:

เมื่อใดก็ตามที่patternพารามิเตอร์ถูกละเว้นอย่างสมบูรณ์\dคำสั่งจะแสดงอ็อบเจ็กต์ทั้งหมดที่มองเห็นได้ในพา ธ การค้นหาสกีมาปัจจุบันซึ่งเทียบเท่ากับการใช้*เป็นรูปแบบ (มีการบอกว่าวัตถุนั้นสามารถมองเห็นได้หากมีสคีมาอยู่ในพา ธ การค้นหาและไม่มีออบเจ็กต์ชนิดและชื่อเดียวกันปรากฏก่อนหน้าในพา ธ การค้นหาซึ่งเทียบเท่ากับข้อความที่ว่าวัตถุนั้นสามารถอ้างอิงได้โดยไม่มีชื่อสคีมา คุณสมบัติ) หากต้องการดูวัตถุทั้งหมดในฐานข้อมูลโดยไม่คำนึงถึงการมองเห็นให้ใช้*.*เป็นรูปแบบ

เหมืองเน้นหนัก
เห็นได้ชัดว่าคุณมีoecd_clก่อนreferenceของคุณในเส้นทางการค้นหา ใช้สิ่งนี้เพื่อจุดประสงค์ของคุณ:

\dt *.donor*

และคุณจะได้รับ:

                          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)

ตกลงฉันเข้าใจแล้ว นี่คือการติดตาม q: ถ้าฉันไม่รู้ว่ามีสองตารางที่มีชื่อเดียวกันในสกีมาที่แตกต่างกันสองรายการใน DB และต้องการดูตารางทั้งหมดในสกีมาทั้งหมดใน DB นี้มีคำสั่ง psql meta ที่จะแสดงพวกเขาทั้งหมดโดยไม่คำนึงถึงว่าสคีมาถูกวางไว้ในsearch_pathครั้งแรกและโดยที่ฉันไม่รู้ชื่อตาราง / สคีล่วงหน้า? หรือฉันดีกว่าการสอบถามinformation schemaเช่น: SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;?
dw8547

@ user4842454: สคีมาข้อมูลมีคำเตือนเป็นของตัวเอง . หากต้องการดูตารางทั้งหมด (รวมถึงแคตตาล็อกระบบ) ให้ใช้\dt *.*ตามคำแนะนำในใบเสนอราคา
Erwin Brandstetter

1

คำสั่งแรกใช้งานได้เนื่องจากตารางที่ระบุไว้ทั้งหมดมี 'การอ้างอิง' ในสคีมาของพวกเขา คำสั่งที่สองทำงานเหมือนกันสำหรับ 'ผู้บริจาค' ดังนั้นความสัมพันธ์ "reference.iso_3166_1" จึงไม่มี 'ผู้บริจาค' ในชื่อ หากคุณต้องการแสดงรายการ iso_3166_1 ให้ลอง

    \dt+ iso*

อ้างอิง: http://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-PATTERNS


คำถามคือสาเหตุที่reference | donorไม่อยู่ในรายการด้วยคำสั่งที่ 2
ypercubeᵀᴹ

@SahapAsci: ข้อกังวลหลักของฉันเกี่ยวกับสาเหตุที่\dt(หรือ\dt+) ไม่แสดงรายการตาราง Reference.donor ทั้งหมดเป็นไปตามตารางการอ้างอิง iso_3166_1
dw8547
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.