PostgresのViewを変更すときに気をつけることをまとめました。
Viewの更新について変更方法は2つあります。
1.Create OR Replaceで作成し同じくCreate OR Replaceで変更する
2.DROPして再度作りなおす
1番が正攻法な気がしますが、公式ドキュメントに下記のような仕様があります。
「このコマンドでは、同じ名前のビューが既に存在している場合、そのビューを置き換えます。 新しい問い合わせは、既存のビュー問い合わせが生成する列と同じ列(つまり、同じ順序の同じデータ型の同じ列名)を生成しなければなりません。 しかし、そのリストの最後に列を追加しても構いません。 出力列を生成する計算をまったく異なるものにしても構いません。」
https://www.postgresql.jp/document/10/html/sql-createview.html
なのでa(varchar),b(vachar)の列で作成されたviewにc(varchar)を付け足すことはできるが、a(varchar)をa(int)に変えたり、b(varchar)をd(varchar)に変えたり、b(vachar),a(varchar)と順序を変えたりすることはできない。
型を変えたときのエラー(バージョンは9.4で試しました)
ERROR: ビューのカラム “カラム名” のデータ型を〇〇◯ から ✗✗✗ に変更できません
SQLステート:42P16
列名を変えたときのエラー(バージョンは9.4で試しました)
ERROR: ビューのカラムの名前を “もとの列名” から “新しい列名” に変更できません
SQLステート:42P16
列の順序を変えたときのエラー(バージョンは9.4で試しました)
ERROR: ビューのカラムの名前を “もとの列名” から “新しい列名” に変更できません
SQLステート:42P16
※これは列名を変えたまたは型を変えたとみなされてダメみたいですね。
なので、変更するときは2を使ったほうが良さそうですね。
こちらは一度DROPして作詞得し直す形になります。注意点はトランザクションをはったうえでコマンドを実行しないと、アクセスしているプロセスがいた場合にエラーになります。