web-dev-qa-db-ja.com

psql内で\ dt(+)を使用するとテーブル(PostgreSQL)が表示されないのはなぜですか?

次のように、スキーマ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;
_

明確にするために、私は2つのdonorテーブルを持っていますが、それらは2つの異なるスキーマ、つまり_oecd.donor_と_reference.donor_にあります。 (psql内で\dt(+)を使用すると、_oecd.donor_は問題なく表示されます)。

12
dw8547

psqlのドキュメントで説明されています:

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

大胆な強調鉱山。
明らかに、あなたの search pathreferenceの前にoecd_clがあります。あなたの目的のためにこれを使用してください:

\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)
11

リストされているすべてのテーブルのスキーマに「参照」があるため、最初のコマンドが機能します。 2番目のコマンドは「ドナー」に対して同じように機能します。そのため、リレーション「reference.iso_3166_1」の名前には「ドナー」がありません。 iso_3166_1を一覧表示したい場合は、

    \dt+ iso*

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

1
Sahap Asci