web-dev-qa-db-ja.com

すべてのマテリアライズドビューを一覧表示/削除するpostgresコマンドはありますか?

コードで複数のビューを作成していますが、コードを実行するたびに、これまでに生成されたすべてのマテリアライズドビューを削除したいと思います。 Postgresのすべてのマテリアライズドビューを一覧表示したり、すべてを削除したりするコマンドはありますか?

20
user1150989

すべて表示する:

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を削除してもよろしいですか?そして、あなたはそうするために必要な特権を持っていますか? (現在、新しい標準インストールにはマテリアライズドビューはありません。)

40

これは、各ビューの前にDROPステートメントを含む完全なリストを取得する場合に簡単です。

SELECT 'DROP MATERIALIZED VIEW ' || relname || ';' 
FROM   pg_class
WHERE  relkind = 'm';
0
durbin510

この回答は、 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>>'
0
Stefan