在PostgreSQL中删除所有视图

20

这似乎是一个非常简单的问题,但我找不到答案!如何在postgreSQL控制台中批量删除视图?我创建了10,000个视图来测试,现在我无法摆脱它们!

5个回答

23

你可以从元数据表中选择视图,如下所示(如果使用旧版本,则实际选择可能会有所不同,例如请参见此处 http://www.alberton.info/postgresql_meta_info.html

SELECT 'DROP VIEW ' || table_name || ';'
  FROM information_schema.views
 WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
   AND table_name !~ '^pg_';

所以您需要根据实际版本修复此select语句,运行它,将结果保存到.sql文件中,然后运行该.sql文件。


执行后,我该如何将其写入SQL文件?复制粘贴吗? - samach
psql - 将命令结果保存到文件中 https://dev59.com/72435IYBdhLWcg3wlBGD - bpgergo
如果一些视图引用了其他视图,您可能需要执行 'DROP VIEW ' || table_name || ' CASCADE;' - 200_success

15

我添加这个答案是参考了@greg的评论,他又引用了一个名为justbob的用户的回答,但该回答似乎已经不存在了。这个评论对我很有帮助,但其他人可能会轻易忽略它。

虽然它没有回答samachs的问题,因为他的观点已经得出,但它可能会帮助像我这样在谷歌搜索批量删除所有视图方法时发现这个问题的人。

我有几个依赖于另一个并由不断发展的脚本生成的视图。因此,当添加或删除视图时,必须进行一些更改。为了限制我添加或删除视图时需要进行更改的地方,我想在创建它们之前先将它们全部删除。

我现在使用的解决方案是在一个单独的模式中创建所有视图,该模式除了视图外什么也没有。

在我的脚本开始之前,我有以下语句来创建我的视图:

DROP SCHEMA IF EXISTS dbview_schema CASCADE;
CREATE SCHEMA dbview_schema;

之后,我将所有的视图都重新创建在它们自己的模式中:

CREATE VIEW dbview_schema.my_view AS
  SELECT * FROM my_table
  ORDER BY my_table.my_column;

这是一个非常好的且简单的解决方案。真希望我一两年前就想到了它。 :) 下次我会按照这种方式设置事物。总的来说,将视图分开更加清晰。 - LaVache
谢谢分享这个想法,我也认为这是更有效和清晰的解决方案! - zhihong
我有完全相同的用例,我真的很喜欢你的解决方案。 - Saffie
我对这个答案感到“启迪”,它是一个优雅的解决方案,可以持续地管理视图模式问题。在应用程序模式迁移的情况下,甚至可能适合使用此技术为每个部署版本的应用程序拥有不同的视图模式作为管理不同应用程序版本所需逻辑的基础。 - Tyson

6

测试一下,看看是否有效。我是凭记忆写的,所以可能会有一些语法问题。

BEGIN TRANSACTION;
    DO $$DECLARE r record;
         DECLARE s TEXT;
        BEGIN
            FOR r IN select table_schema,table_name
                     from information_schema.views
                     where table_schema = 'public'
            LOOP
                s := 'DROP VIEW ' ||  quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ';';

                EXECUTE s;

                RAISE NOTICE 's = % ',s;

            END LOOP;
        END$$;
    ROLLBACK TRANSACTION;

模式名称将是视图所在的任何一个。 - Kuberchaun
FYI,这个DO语句的语法只在9.x+版本中存在。 - Kuberchaun
2
我认为justbob的答案是正确的。为了不必每次都这样做,只需在单独的“SCHEMA”中创建所有视图,并在使用后删除此架构即可更轻松地完成工作。 - greg
谢谢!我对这个还有点新,不知道如何执行函数。我应该在控制台中编写这个函数吗?我的视图模式是pg_temp_3。 - samach
我添加了一个raise通知,这样你就可以看到它正在执行的语句。现在运行它,看看输出是否有正确的drop语句。一旦你想要实际发生更改,你需要将rollback更改为commit。我添加了rollback以防它做了什么不好的事情。 - Kuberchaun
显示剩余6条评论

1

删除所有视图(2022/03/12 版本)

简短命令版本:

SELECT 'DROP VIEW ' || string_agg (table_name, ', ') || ' cascade;'
  FROM information_schema.views
 WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
   AND table_name !~ '^pg_';
   

输出

DROP VIEW v_mytable, v_my_view cascade;

删除所有物化视图


   
SELECT 'DROP MATERIALIZED VIEW ' || string_agg(oid::regclass::text, ', ') || ' cascade;'
FROM   pg_class
WHERE  relkind = 'm';

0
当我首先删除特定视图时,我会得到以下脚本的备份;
WITH dump_options AS (
  -- feel free to add any dump options
  SELECT '--file=/tmp/create_views.sql --host=... my_db_name' AS dump_options
)
SELECT
    format(e'pg_dump --schema-only --format=plain \\\n%s \\\n%s', 
      string_agg(
        format('--table="%s.%s"', v.schemaname, v.viewname),
        e' \\\n'
      ),
      d.dump_options
    ) create_views
  FROM pg_views v, dump_options d
  WHERE 
    v.schemaname NOT IN (
      'pg_catalog',
      'information_schema',
      'any_other_schema'
    ) AND
    v.viewname NOT IN (
      'pg_stat_statements'
    ) AND
    (v.schemaname, v.viewname) NOT IN (
      ('a_particular_schema', 'a_particular_view')
    )
    -- AND ...

  GROUP BY d.dump_options

该脚本创建了一个转储命令,当我们运行它时,将备份所有视图及其所有者和权限。

pg_dump --schema-only --format=plain \
--table="a_schema.a_view" \
--table="another_schema.another_view" \
... \
--file=/tmp/create_views.sql --host=... my_db_name

最后,我使用以下命令删除视图(建议使用psql);
SELECT
    format('DROP VIEW IF EXISTS %I.%I;', v.schemaname, v.viewname) drop_views
  FROM pg_views v
  WHERE -- the very same where clause used above 
    v.schemaname NOT IN (
      'pg_catalog',
      'information_schema',
      'any_other_schema'
    ) AND
    v.viewname NOT IN (
      'pg_stat_statements'
    ) AND
    (v.schemaname, v.viewname) NOT IN (
      ('a_particular_schema', 'a_particular_view')
    )
    -- AND ...
  ;  -- \gexec 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接