Почему postgresql pg_dump экспортирует представление в виде таблицы?

10

Я использую pg_dumpинструмент PostgreSQL 9.3 для извлечения только определения публичной схемы, используя:

pg_dump -s -n public -h host -U postgres --dbname=db > ./schema.sql

но когда я проверяю, schema.sqlодна из наших точек зрения появляется в CREATE TABLEутверждении вместо CREATE VIEWутверждения.

Но, если я pg_dumpконкретный вид использовал:

pg_dump -s -t myview -h host -U postgres --dbname=db > ./schema.sql

затем schema.sqlсодержит фактическое определение представления.

Итак, почему это происходит? Спасибо вам, ребята!

Lben
источник

Ответы:

12

Внутренне представление - это просто таблица с правилом, так что это имеет смысл.

Смотрите здесь: https://postgresql.org/docs/9.5/static/rules-views.html

Представления в PostgreSQL реализуются с использованием системы правил. На самом деле, по сути, нет никакой разницы между:

CREATE VIEW myview AS SELECT * FROM mytab;

по сравнению с двумя командами:

CREATE TABLE myview (same column list as mytab);
CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD
    SELECT * FROM mytab;

потому что это именно то, что CREATE VIEWкоманда делает внутри. Это имеет некоторые побочные эффекты. Одним из них является то, что информация о представлении в системных каталогах PostgreSQL точно такая же, как и для таблицы. Так что для парсера нет абсолютно никакой разницы между таблицей и представлением. Это одно и то же: отношения.

Макс Мерфи
источник