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

问题描述 投票:0回答:4

我在代码中创建多个视图,每次运行代码时,我想删除迄今为止生成的所有物化视图。是否有任何命令可以列出 Postgres 的所有物化视图或删除所有它们?

sql postgresql ddl materialized-views drop
4个回答
68
投票

纯SQL

显示全部:

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

根据您当前从 search_path

regclass 的转换中的
text
,名称会在需要时自动用双引号引起来并进行模式限定。

在系统目录中

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, ...

一个

DROP MATERIALIZED VIEW
语句可以处理多个物化视图。如果您有嵌套视图,您可能需要在末尾添加
CASCADE

在执行之前检查生成的 DDL 脚本以确保其正确。您确定要从数据库中的所有模式中删除all MV 吗?您是否拥有这样做所需的权限? (目前新的标准安装中没有物化视图。)

psql 中的元命令

在默认的交互终端

psql
中,可以使用元命令:

\dm

在服务器上执行此查询:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('m','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;

可以简化为:

SELECT n.nspname as "Schema"
     , c.relname as "Name"
     , pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM   pg_catalog.pg_class c
LEFT   JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE  c.relkind = 'm'
AND    n.nspname <> 'pg_catalog'
AND    n.nspname <> 'information_schema'
AND    n.nspname !~ '^pg_toast'
AND    pg_catalog.pg_table_is_visible(c.oid)
ORDER  BY 1,2;

2
投票

您还可以使用

pg_matviews
系统视图列出所有物化视图。如果物化视图已填充或为空(
ispopulated
列)

,此视图将为您提供包括物化视图定义在内的信息
select * 
from pg_matviews
where matviewname = 'my_materialized_view';

1
投票

此答案基于 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
投票

如果您想获得每个视图前面带有 DROP 语句的完整列表,这会更容易:

SELECT 'DROP MATERIALIZED VIEW ' || relname || ';' 
FROM   pg_class
WHERE  relkind = 'm';
© www.soinside.com 2019 - 2024. All rights reserved.