Saya mempunyai VIEW
tempat untuk mencoba membuat skrip evolusi, sehingga saya dapat menambahkan kolom ke dalamnya. Bagian itu berfungsi dengan baik; kolom ditambahkan dengan baik. Namun, kebalikannya tidak bekerja; hapus kolom yang terakhir ditambahkan gagal dengan ERROR: cannot drop columns from view
pesan. Masalahnya adalah bahwa pandangan khusus ini memiliki banyak referensi, baik dari dan ke, oleh karena itu saya tidak bisa begitu DROP CASCADE
saja!
Apakah ada alasan mengapa saya tidak dapat menghapus kolom yang baru ditambahkan dari yang diberikan VIEW
? Lalu, apa yang bisa saya lakukan untuk menyelesaikan tugas ini?
(Catatan: keadaannya, di sini, adalah apa adanya, tapi saya bisa melihat situasi yang sama, alias menjatuhkan kolom dari tampilan, dalam banyak kasus lain.)
sumber
ALTER VIEW ... ADD COLUMN
. Apakah Anda menggunakanCREATE OR REPLACE VIEW
? Tolong tunjukkan kode Anda .CREATE OR REPLACE VIEW
dengan def yang sama, kecuali kolom tambahan (karena tabel ref'ed memiliki kolom baru ditambahkan, jadi pandangan harus memasukkannya). "Devolution" menghapus kolom dari tabel yang ditolak, sehinggaVIEW
harus juga tidak mengembalikannya lagi.Jawaban:
PostgreSQL (true hingga setidaknya 9,4) saat ini tidak mendukung penghapusan kolom dengan
CREATE OR REPLACE VIEW
.Tidak ada alasan mendasar mengapa dukungan untuk menjatuhkan kolom tidak dapat ditambahkan, tetapi belum ada yang melakukan pekerjaan yang diperlukan untuk mengimplementasikannya.
CREATE OR REPLACE VIEW
harus memindai semua dependensi secara rekursif dan memastikan bahwa tidak ada yang mereferensikan kolom yang akan dihapus. Jika mereka menggunakanSELECT *
itu harus menghapus kolom dari ekspansi*
di ketergantungan kemudian memindai nya dependensi juga. Ada sedikit pekerjaan yang terlibat dalam melakukan itu, dan ada beberapa area di mana tidak jelas bagaimana tepatnya menjatuhkan kolom harus berperilaku terutama ketika datang ke interaksi dengan dump dan memuat ulang. Jadi belum ada yang menginginkan fitur yang cukup untuk mengimplementasikannya. Tambalan dan / atau sponsor pembangunan dipersilakan.Anda harus membuang tampilan dan segala sesuatu yang bergantung padanya, lalu membuatnya kembali dan dependensinya. (Hal yang sama berlaku untuk menambahkan kolom ke tampilan; dukungan untuk menambahkan kolom diperkenalkan pada 8.4).
Perhatikan bahwa secara umum tidak ada harapan bahwa DDL dapat dibalik. Konsep "devolusi" benar-benar cacat. Misalnya, jika Anda menjatuhkan kolom, lalu menambahkannya lagi, data masih hilang.
sumber