Чому я не можу побачити свою таблицю (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).

Відповіді:


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)

Добре, я розумію. Це подальше запитання: якщо я не знав, що у двох різних схемах в БД є дві таблиці з однаковим іменем, і хотів переглянути всі таблиці у всіх схемах у цій БД, чи є мета-команда 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*

ref: 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.