PostgreSQL:ビューから列を削除


10

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

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

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


そもそもどうやって列を追加したのですか?あなたはできませんALTER VIEW ... ADD COLUMN。使っていCREATE OR REPLACE VIEWますか?コード表示してください。
クレイグリンガー、2014

@CraigRinger、はい、CREATE OR REPLACE VIEW追加の列を除いて同じ定義を使用します(参照されたテーブルには新しい列が追加されているため、ビューにそれを含める必要があるため)。「デボルブ」は、参照されたテーブルから列を削除するため、VIEWそれを返す必要はありません。
Yanick Rochon、2014

回答:


13

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

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

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

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

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

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


1
つまり、複雑な関係を持つ大規模なアプリケーションで列を変更する必要がある場合は常に、DDL全体(または少なくとも大部分)を再作成する必要があるということです。私はpostgreでの経験はあまりありませんが、mySQLから来たので、そのような問題は一度もありませんでした(Oracle、SQL Server、またはMySQLを使用)。 any)代わりに実行時にスローされます。この制限は非常に限定的です。
Yanick Rochon、2014

@YanickRochonうん、それは苦痛であり、それが改善されるのを見てみたい。それを実現する手助けをしたい場合は、それに資金を提供することを検討してください。postgresql.org/support/professional_supportを参照してください。
クレイグリンガー2014

私たちはそのような企業に資金を供給するには小さすぎます。しかし、それが固定トピックではないことを確認してうれしいです。
Yanick Rochon、2014

1
@YanickRochonフェア十分。それはTODOにあります-「基になるテーブルが変更されたときにビュー/ルールの再コンパイルを許可する」、wiki.postgresql.org / wiki / Todo#Views_and_Rules
クレイグリンガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.