Por que o postgresql pg_dump exporta uma visualização como uma tabela?

10

Estou usando a pg_dumpferramenta PostgreSQL 9.3 para extrair apenas a definição de esquema público usando:

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

mas quando eu checo, schema.sqluma de nossas visões aparece em uma CREATE TABLEdeclaração em vez de em uma CREATE VIEWdeclaração.

Mas, se eu pg_dumpa visão específica usando:

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

em seguida, schema.sqlcontém a definição de exibição real.

Então, por que isso está acontecendo? Obrigado pessoal!

Lben
fonte

Respostas:

12

Internamente, uma visualização é apenas uma tabela com uma regra, portanto, isso faz sentido.

Veja aqui: https://postgresql.org/docs/9.5/static/rules-views.html

As visualizações no PostgreSQL são implementadas usando o sistema de regras. De fato, não há essencialmente nenhuma diferença entre:

CREATE VIEW myview AS SELECT * FROM mytab;

comparado com os dois comandos:

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

porque é exatamente isso que o CREATE VIEWcomando faz internamente. Isso tem alguns efeitos colaterais. Uma delas é que as informações sobre uma exibição nos catálogos do sistema PostgreSQL são exatamente as mesmas de uma tabela. Portanto, para o analisador, não há absolutamente nenhuma diferença entre uma tabela e uma exibição. Eles são a mesma coisa: relações.

Max Murphy
fonte