Есть ли команда postgres для отображения / удаления всех материализованных представлений?

Я создаю несколько представлений в своем коде, и каждый раз, когда код запускается, я хотел бы удалить все материализованные представления, созданные до сих пор. Есть ли команда, которая перечислит все материализованные представления для Postgres или отбросит их все?

3 ответов


показать все:

SELECT oid::regclass::text
FROM   pg_class
WHERE  relkind = 'm';

имена автоматически двойные кавычки и схемы-квалифицированные, где это необходимо в соответствии с вашим текущим search_path в с regclass to text.

в системном каталоге pg_class материализованные представления помечены relkind = 'm'.
инструкции:

m = materialized view

до падение все, вы можете создать необходимый сценарий 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, ...

один DROP MATERIALIZED VIEW оператор может позаботиться о нескольких материализованных представлениях. Вы, возможно, должны добавить CASCADE в конце, если у вас есть вложенные представления.

Проверьте полученный сценарий DDL, чтобы быть уверенным перед его выполнением. Вы уверены, что хотите удалить все MVs из всех схем в БД? И у вас есть для этого необходимые привилегии? (В настоящее время материализованных представлений в свежая стандартная установка.)


Это было бы проще, если вы хотите получить полный список с инструкцией DROP перед каждым представлением:

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

этот ответ основан на ответе от Эрвин Брандштеттер. Версия ниже добавляет определенное имя схемы, чтобы получить только материализованные представления из определенной схемы. 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>>'