web-dev-qa-db-ja.com

PostgreSQL:ビューから列を削除

VIEWがあり、そこで進化スクリプトを作成しようとしているので、それに列を追加できます。その部分は問題なく動作します。列は問題なく追加されました。ただし、その逆は機能しません。最後に追加された列を削除すると、ERROR: cannot drop columns from viewメッセージが表示されて失敗します。問題は、この特定のビューがfromとtoの両方に多くの参照を持っていることです。そのため、私はまったくDROP CASCADEできないのです!

新しく追加された列を特定のVIEWから削除できない理由はありますか?次に、このタスクを実行するにはどうすればよいですか?

(注:ここに示すのは状況ですが、他の多くの場合でも、ビューから列を削除するなど、同じような状況がよくわかります。)

10
Yanick Rochon

PostgreSQL(少なくとも9.4までは真)は、現在 CREATE OR REPLACE VIEW を使用した列の削除をサポートしていません。

新しいクエリは、既存のビュークエリによって生成されたものと同じ列(つまり、同じ列名と同じ順序で同じデータ型)を生成する必要がありますが、リストの最後に列を追加する場合があります。

列を削除するためのサポートを追加できなかった根本的な理由はありませんが、実装に必要な作業はまだ誰も行っていません。

CREATE OR REPLACE VIEWは、すべての依存関係を再帰的にスキャンし、削除する列を参照する依存関係がないことを確認する必要があります。彼らがSELECT *を使用した場合、依存関係の*の展開から列を削除する必要があります。次に、依存関係をスキャンしますits依存関係あまりにも。これを行うにはかなりの作業が必要です。特にダンプとリロードの相互作用に関しては、列のドロップが正確にどのように動作するかが明確でない領域がいくつかあります。そのため、まだ実装するのに十分な機能を望んでいません。パッチおよび/または開発のスポンサーは大歓迎です。

ビューとそれに依存するすべてのものを削除してから、ビューとその依存関係を再作成する必要があります。 (ビューに列をaddingする場合も同様でした。8.4で列の追加のサポートが導入されました)。

一般に、DDLが可逆的であるとは想定されていないことに注意してください。 「デボリューション」の概念には本当に欠陥があります。たとえば、列を削除してから再度追加すると、データは失われます。

13
Craig Ringer