Я создаю несколько представлений в моем коде, и каждый раз, когда выполняется код, я хотел бы удалить все материализованные представления, созданные до сих пор. Есть ли какая-либо команда, которая будет перечислять все материализованные представления для Postgres или удалить все из них?
Есть ли команда postgres для перечисления/удаления всех материализованных представлений?
Ответ 1
Показать все:
SELECT oid::regclass::text
FROM pg_class
WHERE relkind = 'm';
Имена автоматически экранируются и имеют соответствующую схему в соответствии с вашим текущим search_path
, где это необходимо, в листинге от regclass
до text
.
Материализованные представления в системном каталоге pg_class
обозначаются relkind = 'm'
.
В документации:
m = materialized view
Чтобы удалить все, вы можете сгенерировать необходимый SQL script с помощью этого запроса:
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 script, прежде чем выполнять его. Вы уверены, что хотите удалить все MV из всех схем в db? (В настоящее время нет материализованных представлений в новой стандартной установке.)
Ответ 2
Это было бы проще, если вы хотите получить полный список с оператором DROP перед каждым представлением:
SELECT 'DROP MATERIALIZED VIEW ' || relname || ';'
FROM pg_class
WHERE relkind = 'm';
Ответ 3
Этот ответ основан на ответе 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>>'