是否有postgres命令列出/删除所有物化视图?

时间:2014-04-15 19:42:36

标签: database postgresql ddl materialized-views

我在代码中创建了多个视图,每次运行代码时,我都希望删除到目前为止生成的所有物化视图。是否有任何命令会列出Postgres的所有物化视图或删除所有这些视图?

3 个答案:

答案 0 :(得分:39)

全部显示:

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

根据您从regclasstext的演员阵容中的当前search_path,名称会根据需要自动进行双引号和架构限定。

在系统目录pg_class中,实体化视图标有relkind = 'm' The manual:

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脚本以确保它。您确定要从数据库中的所有模式中删除所有 MV吗?您是否拥有所需的权限? (目前在新标准安装中没有物化视图。)

答案 1 :(得分:0)

如果您想在每个视图前面获得包含DROP语句的完整列表,这将更容易:

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

答案 2 :(得分:0)

这个答案是基于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>>'