¿Por qué postgresql pg_dump exporta una vista como una tabla?

10

Estoy usando la pg_dumpherramienta PostgreSQL 9.3 para extraer solo la definición de esquema público usando:

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

pero cuando verifico schema.sqluno de nuestros puntos de vista aparece en una CREATE TABLEdeclaración en lugar de una CREATE VIEWdeclaración.

Pero, si pg_dumpla vista específica usando:

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

luego schema.sqlcontiene la definición de vista real.

Entonces, ¿por qué está pasando esto? ¡Gracias chicos!

Lben
fuente

Respuestas:

12

Internamente, una vista es solo una tabla con una regla, por lo que tiene sentido.

Ver aquí: https://postgresql.org/docs/9.5/static/rules-views.html

Las vistas en PostgreSQL se implementan utilizando el sistema de reglas. De hecho, esencialmente no hay diferencia entre:

CREATE VIEW myview AS SELECT * FROM mytab;

comparado con los dos comandos:

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

porque esto es exactamente lo que hace el CREATE VIEWcomando internamente. Esto tiene algunos efectos secundarios. Una de ellas es que la información sobre una vista en los catálogos del sistema PostgreSQL es exactamente la misma que para una tabla. Entonces, para el analizador, no hay absolutamente ninguna diferencia entre una tabla y una vista. Son lo mismo: relaciones.

Max Murphy
fuente