Почему я не вижу свою таблицу (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включает в себя схему referenceи пользователь postgresимеет все разрешения для схемы referenceи всех таблиц в схеме согласно:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Просто чтобы уточнить, у меня есть две donorтаблицы, но они находятся в двух разных схемах, т. Е. oecd.donor& reference.donor. (Я вижу oecd.donorбез проблем, когда я использую \dt(+)внутри PSQL).

dw8547
источник

Ответы:

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: если я не знал, что в БД есть две таблицы с одинаковыми именами в двух разных схемах, и хотел просмотреть все таблицы во всех схемах в этой БД, есть ли мета-команда psql? что будет отображать их все, независимо от того, какая схема помещена в 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 | donorнет в списке со 2-й командой.
ypercubeᵀᴹ
@SahapAsci: моя главная проблема в том, почему \dt(или \dt+) не перечисляется таблица reference.donor. Все в порядке в соответствии с таблицей reference.iso_3166_1.
dw8547