Dlaczego postgresql pg_dump eksportuje widok jako tabelę?

10

Korzystam z pg_dumpnarzędzia PostgreSQL 9.3 do wyodrębniania tylko definicji schematu publicznego przy użyciu:

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

ale kiedy sprawdzam, schema.sqljeden z naszych widoków pojawia się w CREATE TABLEoświadczeniu zamiast w CREATE VIEWoświadczeniu.

Ale jeśli mam pg_dumpkonkretny widok za pomocą:

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

następnie schema.sqlzawiera rzeczywistą definicję widoku.

Dlaczego tak się dzieje? Dzięki chłopaki!

Lben
źródło

Odpowiedzi:

12

Widok wewnętrzny jest tylko tabelą z regułą, więc ma to sens.

Zobacz tutaj: https://postgresql.org/docs/9.5/static/rules-views.html

Widoki w PostgreSQL są implementowane przy użyciu systemu reguł. W rzeczywistości nie ma zasadniczo różnicy między:

CREATE VIEW myview AS SELECT * FROM mytab;

w porównaniu z dwoma poleceniami:

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

ponieważ to właśnie robi to CREATE VIEWpolecenie wewnętrznie. Ma to pewne skutki uboczne. Jednym z nich jest to, że informacje o widoku w katalogach systemowych PostgreSQL są dokładnie takie same jak w przypadku tabeli. Zatem dla parsera absolutnie nie ma różnicy między tabelą a widokiem. Są to to samo: relacje.

Max Murphy
źródło