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입니다. ( psql 내부에서 oecd.donor사용할 때 아무런 문제없이 볼 수 있습니다 \dt(+)).

답변:


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)

알았어 이것은 후속 질문입니다 : 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"관계에는 이름에 'donor'가 없습니다. iso_3166_1을 나열하려면 시도하십시오.

    \dt+ iso*

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


문제는 왜 reference | donor두 번째 명령과 함께 나열되지 않았는가 입니다.
ypercubeᵀᴹ

@SahapAsci : 내 주요 관심사는 왜 \dt(또는 \dt+)가 reference.donor 테이블을 나열하지 않는지에 관한 것입니다. reference.iso_3166_1 테이블에 따라 모두 정상입니다.
dw8547
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.