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+

My search_pathにはスキーマが含まれておりreference、ユーザーpostgresはスキーマに対するすべての権限とスキーマreference内のすべてのテーブルを持っています:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

明確にするために、2つのdonorテーブルがありますが、それらは2つの異なるスキーマ、つまりoecd.donor&にありreference.donorます。(psql内でoecd.donor使用すると問題なく表示できます\dt(+))。

回答:


11

psqlのドキュメントでは次のことが説明されています。

たびにpatternパラメータが完全に省略され、\dコマンドは、現在のスキーマ検索パスに表示されているすべてのオブジェクトを表示する-これは使用に相当する*パターンとして。(オブジェクトを含むスキーマが検索パスにあり、同じ種類と名前のオブジェクトが検索パスの前に表示されない場合、オブジェクトは可視であると言われます。これは、明示的なスキーマなしで名前でオブジェクトを参照できるステートメントと同等です資格。)可視性に関係なくデータベース内のすべてのオブジェクトを表示するに*.*は、パターンとして使用します。

大胆な強調鉱山。
明らかに、oecd_clreference検索パスにあります。これを目的に使用します。

\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の2つの異なるスキーマに同じ名前の2つのテーブルがあることを知らず、このDBのすべてのスキーマのすべてのテーブルを表示したい場合、psqlメタコマンドがありますどのスキーマがsearch_path最初に配置されていても、テーブル/スキーマ名を事前に知らなくても、すべて表示されますか?または、information schemaたとえば、クエリの方が良いSELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;ですか?
dw8547

@ user4842454:情報スキーマには独自の警告があります。。表示するには、すべての利用(システムカタログを含む)の表\dt *.*の引用の指示通りに。
アーウィンブランドステッター

1

リストされたすべてのテーブルにスキーマの「参照」があるため、最初のコマンドが機能します。2番目のコマンドは、「ドナー」に対して同じように機能します。したがって、リレーション「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テーブルをリストしないのかということです。reference.iso_3166_1テーブルに従って、すべて問題ありません。
dw8547
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.