जब मैं psql के अंदर \ dt (+) का उपयोग करता हूं तो मैं अपनी तालिका (PostgreSQL) क्यों नहीं देख सकता?


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स्कीमा शामिल है referenceऔर उपयोगकर्ता के postgresपास स्कीमा पर सभी अनुमतियाँ हैं referenceऔर स्कीमा के अनुसार सभी तालिकाएँ हैं:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

बस स्पष्ट करने के लिए, मेरे पास दो donorटेबल हैं, लेकिन वे दो अलग-अलग स्कीमाओं में हैं, 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 के सभी स्कीमाओं में सभी तालिकाओं को देखना चाहते हैं, तो क्या कोई psq meta कमांड है यह उन सभी को प्रदर्शित करेगा, चाहे जो भी स्कीमा search_pathपहले से रखी हो और मेरे बिना पहले से टेबल / स्कीमा के नाम जाने? या क्या मैं information schemaउदाहरण के लिए क्वेरी करने से बेहतर हूं SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;:?
dw8547

@ user4842454: सूचना स्कीमा के पास अपने स्वयं के कक्ष हैं। सभी तालिकाओं को देखने के लिए (सिस्टम कैटलॉग सहित) \dt *.*उद्धरण में निर्देश के अनुसार उपयोग करें ।
एरविन ब्रान्डसेट्टर

1

पहला कमांड काम करता है क्योंकि सभी सूचीबद्ध तालिकाओं में उनके स्कीमा में 'संदर्भ' होता है। दूसरा कमांड 'डोनर' के लिए समान काम करता है। इसलिए संबंध "reference.iso_3166_1" के नाम में कोई 'दाता' नहीं है। अगर आप iso_3166_1 को सूचीबद्ध करना चाहते हैं तो अभी प्रयास करें

    \dt+ iso*

रेफरी: http://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-PATTERNS


सवाल यह है कि reference | donor2 डी कमांड के साथ सूचीबद्ध क्यों नहीं है।
ypercube y

@ शेहापसी: मेरी मुख्य चिंता यह है कि क्यों \dt(या \dt+) संदर्भ को सूचीबद्ध नहीं करता है। तालिका। सभी संदर्भ के अनुसार ठीक है ।iso_3166_1 तालिका।
dw8547
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.