Mengapa postgresql pg_dump mengekspor tampilan sebagai tabel?

10

Saya menggunakan pg_dumpalat PostgreSQL 9.3 untuk mengekstraksi hanya definisi skema publik menggunakan:

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

tetapi ketika saya memeriksa schema.sqlsalah satu pandangan kita muncul dalam sebuah CREATE TABLEpernyataan, bukan sebuah CREATE VIEWpernyataan.

Tapi, jika saya pg_dumpmelihat spesifik menggunakan:

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

kemudian schema.sqlberisi definisi tampilan aktual.

Jadi mengapa hal ini terjadi? Terima kasih kawan!

Lben
sumber

Jawaban:

12

Secara internal, tampilan hanyalah tabel dengan aturan, jadi ini masuk akal.

Lihat di sini: https://postgresql.org/docs/9.5/static/rules-views.html

Tampilan di PostgreSQL diimplementasikan menggunakan sistem aturan. Bahkan, pada dasarnya tidak ada perbedaan antara:

CREATE VIEW myview AS SELECT * FROM mytab;

dibandingkan dengan dua perintah:

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

karena inilah yang dilakukan CREATE VIEWperintah secara internal. Ini memiliki beberapa efek samping. Salah satunya adalah bahwa informasi tentang tampilan dalam katalog sistem PostgreSQL persis sama dengan tabel. Jadi untuk parser, sama sekali tidak ada perbedaan antara tabel dan tampilan. Mereka adalah hal yang sama: hubungan.

Max Murphy
sumber