4

状況によっては、PostgreSQL にビューがあります。これは、通常の状態でも実体化された状態でもかまいません。現時点でどのようなタイプであっても、ビューを確実にドロップし、エラーなしでエラーを発生させないクエリを作成しようとしています。しかし、これは簡単ではないようです。次のコードを使用しようとすると、エラーが発生します。

DROP VIEW IF EXISTS {{ schema }}.{{ viewName }};
DROP MATERIALIZED VIEW IF EXISTS {{ schema }}.{{ viewName }};

 

SQLSTATE[42809]: Wrong object type: 7 ERROR:  "{{ viewName }}" is not a view  
HINT:  Use DROP MATERIALIZED VIEW to remove a materialized view.    

このように、ビューが実体化され、DROP コマンドが起動されると、最初の行で 'IF EXISTS' が true になるように見えますが、ビューのタイプが間違っているため失敗します (正常ではありません)。マテリアライズドビューと通常のビューの両方で機能する普遍的な回避策を誰かが提案できますか?

4

2 に答える 2

1

ありません。とにかく、簡単ではありません... Postgresが報告しているように、2つは別の動物です。

if exists が作動する理由は、これがすべて pg_class に存在するためだと思います。テスト テーブルを作成して実行しようとするとdrop view if exists test、同様のエラーが発生します。

あまり優れた回避策として、pg_catalog.pg_class 内のエンティティの型をチェックして、扱っているものの正確な型 (テーブル、ビュー、マット ビューなど)。

于 2013-10-22T17:24:45.760 に答える