删除postgreSql中的所有视图

时间:2012-08-22 14:38:44

标签: postgresql view

这似乎是一个非常简单的问题,但我无法找到它的答案! 如何从postgreSQL控制台批量删除视图?我有10,000次观看,我只是为了测试一些东西,现在我无法摆脱它们!

4 个答案:

答案 0 :(得分:9)

您可以从元表中选择视图,如下所示(如果使用旧版本,实际选择可能会有所不同,请参见此处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_';

因此,您根据实际版本修复此选择,运行它,将结果保存到.sql文件中,然后运行.sql文件。

答案 1 :(得分:6)

我添加了这个引用@greg评论的答案,而@greg又引用了一个名为justbob的用户的答案,这个答案似乎已经消失了。这个评论给了我很多帮助,但很容易被其他人忽视。

虽然它没有回答samachs的问题,因为他的观点已经完成,它可能会帮助像我这样的人在google搜索后找到一个方法来删除批量操作中的所有视图。

我有一些视图依赖于另一个视图,并且是由不断发展的脚本生成的。因此,将在脚本中添加或删除一些视图。要在添加或删除视图时限制我必须进行更改的位置,我想在脚本开头再将它们全部删除,然后再重新创建它们。

我现在使用的解决方案是在一个单独的模式中创建所有视图,只包含视图。

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

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;

答案 2 :(得分:3)

测试一下,看看它是否有效。我把它从内存中拉出来,因此可能存在一些语法问题。

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;

答案 3 :(得分: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