Pourquoi postgresql pg_dump exporte une vue sous forme de table?

10

J'utilise l' pg_dumpoutil PostgreSQL 9.3 pour extraire uniquement la définition de schéma public en utilisant:

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

mais quand je vérifie schema.sqlune de nos vues apparaît dans une CREATE TABLEdéclaration au lieu d'une CREATE VIEWdéclaration.

Mais, si je pg_dumpla vue spécifique en utilisant:

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

schema.sqlcontient alors la définition réelle de la vue.

Pourquoi cela se produit-il donc? Merci les gars!

Lben
la source

Réponses:

12

En interne, une vue n'est qu'une table avec une règle, donc cela a du sens.

Voir ici: https://postgresql.org/docs/9.5/static/rules-views.html

Les vues dans PostgreSQL sont implémentées à l'aide du système de règles. En fait, il n'y a essentiellement aucune différence entre:

CREATE VIEW myview AS SELECT * FROM mytab;

par rapport aux deux commandes:

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

car c'est exactement ce que fait la CREATE VIEWcommande en interne. Cela a des effets secondaires. L'un d'eux est que les informations sur une vue dans les catalogues système PostgreSQL sont exactement les mêmes que pour une table. Donc pour l'analyseur, il n'y a absolument aucune différence entre une table et une vue. C'est la même chose: les relations.

Max Murphy
la source