Perché postgresql pg_dump esporta una vista come tabella?


10

Sto usando lo pg_dumpstrumento PostgreSQL 9.3 per estrarre solo la definizione dello schema pubblico usando:

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

ma quando controllo schema.sqluna delle nostre visualizzazioni appare in una CREATE TABLEdichiarazione anziché in una CREATE VIEWdichiarazione.

Ma, se ho pg_dumpla vista specifica utilizzando:

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

quindi schema.sqlcontiene la definizione della vista effettiva.

Quindi, perché sta succedendo questo? Grazie ragazzi!

Risposte:


12

Internamente, una vista è solo una tabella con una regola, quindi questo ha senso.

Vedi qui: https://postgresql.org/docs/9.5/static/rules-views.html

Le viste in PostgreSQL sono implementate usando il sistema di regole. In effetti, non vi è sostanzialmente alcuna differenza tra:

CREATE VIEW myview AS SELECT * FROM mytab;

rispetto ai due comandi:

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

perché questo è esattamente ciò che il CREATE VIEWcomando fa internamente. Questo ha alcuni effetti collaterali. Uno di questi è che le informazioni su una vista nei cataloghi del sistema PostgreSQL sono esattamente le stesse di una tabella. Quindi, per il parser, non c'è assolutamente alcuna differenza tra una tabella e una vista. Sono la stessa cosa: relazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.