Ganti tampilan terwujud di Postgres

23

Saya memiliki pandangan terwujud Postgres 9.3yang ingin saya perbarui dengan kolom baru. Namun, tampilan terwujud lainnya juga tergantung pada tampilan ini, dan pesan kesalahan menunjukkan bahwa menjatuhkan tampilan tidak mungkin ketika objek lain bergantung padanya.

GALAT: tidak dapat menjatuhkan tampilan terwujud latest_charges karena objek lain bergantung padanya

Itu juga muncul dari dokumentasi bahwa kata kunci REPLACE tidak valid untuk tampilan terwujud. Apakah ada jalan pintas selain dari menjatuhkan semua objek bergantung dan membangun kembali masing-masing?

John
sumber
7
Sayangnya, saya pikir Anda terjebak dengan menjatuhkan mereka semua dan membangun kembali.
Craig Ringer
@CraigRinger tertarik menambahkan ini sebagai jawaban?
dezso

Jawaban:

17

Pada PostgreSQL 9.4: Berbeda dengan dokumentasi CREATE VIEW , dokumentasi CREATE MATERIALIZED VIEW TIDAK menyebutkan kata kunci REPLACE. Tampaknya tidak ada jalan pintas selain dari menjatuhkan semua objek bergantung dan membangun kembali masing-masing.

Ketika Anda melakukannya, saya hanya dapat merekomendasikan dua hal kecil:

  1. Gunakan DROP MATERIALIZED VIEW blabla CASCADE untuk mendapatkan daftar semua objek dependen
  2. Lakukan jatuhkan dan rekreasi semua objek dependen dalam satu transaksi.
alfonx
sumber
1
Terima kasih, inilah tepatnya yang telah saya lakukan. Itu hanya rasa sakit untuk tetap lurus karena saya sedang membangun satu basis pandangan terwujud untuk tujuan analitis yang digunakan kembali dalam banyak pandangan lainnya. Tampilan dasar itu jarang berubah, tetapi yang bergantung padanya berubah setiap hari.
John
4

Untuk situasi saya, saya lebih suka membatasi tetesan dengan menggunakan lapisan tampilan:

  1. Buat salinan tampilan terwujud yang diberi sufiks dengan "_new" dan juga gunakan "TANPA DATA" untuk kinerja, pastikan indeks apa pun juga dibuat dengan sufiks dan objek dependen lainnya yang ditemukan melalui DROP ... CASCADE
  2. Buat tampilan pada tampilan terwujud baru untuk memberikan lapisan abstraksi jadi saya hanya perlu mengubahnya di satu tempat
  3. ALTER dependensi yang ada sebagai gantinya merujuk ke tampilan baru (menyegarkan data jika diperlukan sebelumnya)
  4. Jatuhkan tampilan terwujud asli dan indeks yang seharusnya tidak memiliki tanggungan
  5. ALTER THE view terwujud dan indeks untuk menjatuhkan akhiran untuk mengembalikan nama asli

misalnya.

create table test (myfield int);
insert into test values (1);
create materialized view mv_test as select myfield from test;
create view v_test as select myfield from mv_test;
select * from v_test;
create materialized view mv_test_new as select myfield, myfield+1 as myfield2 from test;
alter view v_test rename to v_test_old;
alter materialized view mv_test rename to mv_test_old;
create view v_test as select myfield,myfield2 from mv_test_new;
select * from v_test;
alter materialized view mv_test_new rename to mv_test;
drop view v_test_old; -- when ready
drop materialized view mv_test_old; -- when ready
RuiDC
sumber
Saya tidak jelas tentang dua langkah terakhir itu. Apakah 4 kalimat yang berganti menjadi 5? dapatkah Anda melakukan contoh cepat dengan beberapa tampilan matviews dan tampilan?
kimbo305
mengoreksi kalimat terpotong dan menambahkan contoh
RuiDC
1

Di PgAdmin (versi 4.x), saya dapat dengan mudah memodifikasi definisi (saya menambahkan klausa where) di kotak properti. Masalah Anda bisa diselesaikan dengan cara itu.

pengguna2953022
sumber