TL;DR
- PostgreSQLでビューを置換(CREATE OR REPLACE VIEW)するときに、既存のビュー定義の結果列の定義が変更されているとエラーになる(Oracle だと変更できる)
- この時のエラーメッセージに ALTER VIEW を使うように促されるが、DROP して CREATE VIEW する方法もある
はじめに
弊社では、Oracle・PostgreSQLの二つのDBに対応した生産管理パッケージを開発しています。
少し前、テーブルに項目追加し、既存のビューにも項目を追加する対応をしました。
CREATE OR REPLACE VIEW の 構文を使って ビュー の置換を行おうとしたのですが、少し困ったので、こちらの記事で内容を共有します。
発生したエラーと原因
CREATE OR REPLACE VIEW を実行したところ以下のようなエラーが発生しました。
cannot change name of "OldColumn" to "NewColumn"
HINT: Use ALTER VIEW...RENAME COLUMN ... to change name of view column instead
※ PostgreSQLバージョン:14.6
PostgreSQLのCREATE OR REPLACE VIEW 文では、結果列の型または名前が違うと置換できないことが原因のようです。
Oracleでは、同様の構文で動作したので、少し沼ってました...
対応
エラーメッセージには ALTER VIEW...RENAME COLUMN ...
を使えと書いてあります。
しかし、VIEW を DROP して CREATE VIEW することでも同様の操作ができます。
私は、DROP して CREATE VIEW する方法を採用しました。理由は次の2つです。
- 学習コストが少ない
- Oracle と同じ書き方ができる
- Oracle は ALTER VIEW で結果列の定義変更ができない
参考
以下の記事が大変参考になりました。ありがとうございました。
-
[PostgreSQL]Viewの変更でハマる落とし穴
- CREATE OR REPLACE VIEW でエラーになる詳細なパターンが記載してあってよかった