コードで複数のビューを作成していますが、コードを実行するたびに、これまでに生成されたすべてのマテリアライズドビューを削除したいと思います。 Postgresのすべてのマテリアライズドビューを一覧表示したり、すべてを削除したりするコマンドはありますか?
すべて表示する:
SELECT oid::regclass::text
FROM pg_class
WHERE relkind = 'm';
regclass
からtext
へのキャストでは、現在の search_path
に従って、必要に応じて名前が自動的に二重引用符で囲まれ、スキーマ修飾されます。
システムカタログでは、pg_class
マテリアライズドビューはrelkind = 'm'
でタグ付けされています。
マニュアル:
m = materialized view
すべてをdropするには、次のクエリを使用して必要なSQLスクリプトを生成できます。
SELECT 'DROP MATERIALIZED VIEW ' || string_agg(oid::regclass::text, ', ')
FROM pg_class
WHERE relkind = 'm';
戻り値:
DROP MATERIALIZED VIEW mv1, some_schema_not_in_search_path.mv2, ...
1つの DROP MATERIALIZED VIEW
ステートメントで複数のマテリアライズドビューを処理できます。ビューをネストしている場合は、最後にCASCADE
を追加する必要がある場合があります。
結果のDDLスクリプトを調べて、実行する前に確認してください。データベース内のすべてのスキーマからallMVを削除してもよろしいですか?そして、あなたはそうするために必要な特権を持っていますか? (現在、新しい標準インストールにはマテリアライズドビューはありません。)
これは、各ビューの前にDROPステートメントを含む完全なリストを取得する場合に簡単です。
SELECT 'DROP MATERIALIZED VIEW ' || relname || ';'
FROM pg_class
WHERE relkind = 'm';
この回答は、 Erwin Brandstetter からの回答に基づいています。以下のバージョンでは、特定のスキーマ名を追加して、定義されたスキーマからマテリアライズドビューのみを取得します。 Cascasdeは、そのスキーマからマテリアライズドビューへの依存関係も削除します。それに注意してください。
SELECT 'DROP MATERIALIZED VIEW <<schema_name>>.' || c.relname::text || ' CASCADE;' AS drop_statements
FROM pg_class c
INNER JOIN pg_namespace n ON n.oid = c.relnamespace
AND c.relkind = 'm'
AND n.nspname = '<<schema_name>>'