PostgreSQL: sütunu görünümden çıkarma


10

VIEWBir evrim komut dosyası oluşturmaya çalıştığım bir yer var , bu yüzden ona bir sütun ekleyebilirim. Bu bölüm iyi çalışıyor; sütun iyi eklendi. Ancak, bunun tersi çalışmaz; son eklenen sütunun kaldırılması bir ERROR: cannot drop columns from viewmesajla başarısız olur . Sorun, bu özel görüşün hem referans hem de birçok referansı olması, bu yüzden sadece DROP CASCADElanet şey olamaz !

Belirli bir sütundan yeni eklenen sütunu kaldıramamam için bir neden var mı VIEW? O zaman, bu görevi gerçekleştirmek için ne yapabilirim?

(Not: buradaki koşullar, bunlardır, ancak benzer bir durumu çok iyi görebilirim, diğer birçok durumda bir sütunu bir görünümden bırakarak.)


İlk başta sütunu nasıl eklediniz? Yapamazsın ALTER VIEW ... ADD COLUMN. Kullanıyor musunuz CREATE OR REPLACE VIEW? Kodunuzu gösterin lütfen.
Craig Ringer

@CraigRinger, evet, CREATE OR REPLACE VIEWekstra bir sütun dışında aynı def ile aynı (ref'ed tablosuna yeni bir sütun eklendiğinden, görünüm bunu eklemelidir). Böylece "yetki devri", ref'ed tablodan sütun kaldırır VIEWda vardır değil artık geri.
Yanick Rochon

Yanıtlar:


13

PostgreSQL (en az 9.4'e kadar doğru) şu anda ile bir sütunun kaldırılmasını desteklememektedir CREATE OR REPLACE VIEW.

Yeni sorgu, var olan görünüm sorgusu tarafından oluşturulan sütunları (aynı sırada ve aynı veri türleriyle aynı sütun adları) oluşturmalıdır, ancak listenin sonuna ek sütunlar ekleyebilir.

Sütun bırakma desteğinin eklenememesinin temel bir nedeni yoktur, ancak henüz kimse bunu uygulamak için gereken işi yapmamıştır.

CREATE OR REPLACE VIEWtüm bağımlılıkları özyinelemeli olarak taramak ve hiçbirinin bırakılacak sütuna başvurmadığından emin olmak gerekir. Kullandıkları takdirde SELECT *bunun genişlemesi sütunu kaldırmak zorundayız *bağımlılık sonra tarama içinde kendi bağımlılıklarını da. Bunu yapmak için oldukça fazla iş var ve özellikle dökümü ve yeniden yükleme ile etkileşimler söz konusu olduğunda sütunun tam olarak nasıl bırakılması gerektiği net olmayan bazı alanlar var. Yani kimse bu özelliği henüz uygulamak için yeterince istemedi. Yamalar ve / veya kalkınma sponsorluğu kabul edilir.

Görünümü ve ona bağlı olan her şeyi bırakmanız, ardından görünümü ve bağımlılıklarını yeniden oluşturmanız gerekir. (Aynı şey bir görünüme sütun eklemek için de doğruydu ; 8.4'te sütun ekleme desteği sunuldu).

Genel olarak DDL'nin tersinir olması beklentisi olmadığını unutmayın. "Devrimler" kavramı gerçekten kusurludur. Örneğin, bir sütunu düşürüp tekrar eklerseniz, veriler yine de kaybolur.


2
Yani, karmaşık ilişkilere sahip büyük bir uygulamanın bir sütunu değiştirmesi gerektiğinde, DDL'nin tamamını (veya en azından bir kısmını) yeniden oluşturmanız gerekir mi? Postgre ile çok fazla deneyimim yok, ancak mySQL'den geliyorum, (Oracle, SQL Server veya MySQL ile) hiç böyle bir sorun yaşamadım ve değişiklik basitçe yapılamaz ve hatalar (eğer herhangi bir) yerine yürütme zamanında atılmalıdır. Bu sınırlama oldukça kısıtlayıcıdır.
Yanick Rochon

@YanickRochon Evet, bu bir acı ve iyileştiğini görmek isterim. Bunun gerçekleşmesine yardımcı olmak istiyorsanız, bunun üzerinde fonlama işini düşünün; bkz. postgresql.org/support/professional_support .
Craig Ringer

Böyle bir işletmeyi finanse etmek için çok küçüküz. Ama bunun sabit bir konu olmadığını gördüğüme sevindim.
Yanick Rochon

1
@YanickRochon Fuarı yeterli. TODO'da - "temel tablo değiştiğinde görünüm / kural yeniden derlemesine izin ver ", wiki.postgresql.org/wiki/Todo#Views_and_Rules .
Craig Ringer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.