【问题标题】:Dropping all views in postgreSql删除 postgreSql 中的所有视图
【发布时间】:2012-08-18 00:31:16
【问题描述】:

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

【问题讨论】:

    标签: postgresql view


    【解决方案1】:

    当我首先删除特定视图时,我会使用下面的脚本获得备份;

    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 
    

    【讨论】:

      【解决方案2】:

      我添加了这个答案,它引用了@greg 的评论,而@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;
      

      【讨论】:

      • 这是一个非常好的和简单的解决方案。希望我在一两年前想到它。 :) 下次我会这样设置。更清晰地分开视图。
      • 感谢分享这个想法,也认为它是更有效和清晰的解决方案!
      • 我有完全相同的用例,我真的很喜欢你的解决方案。
      • 我对这个答案感到“开明”,这是解决持续管理视图模式问题的优雅解决方案。在应用程序架构迁移的上下文中,甚至可能适合为每个已部署的应用程序版本使用单独的视图架构,使用此技术作为管理不同应用程序版本所需的不同逻辑的基础。
      【解决方案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;
      

      【讨论】:

      • 架构名称将是视图所在的任何一个。
      • 仅供参考,此 DO 语句语法仅适用于 9.x+。
      • 我认为 justbob 的答案是正确的。为了不必每次都这样做,只需在单独的 SCHEMA 中创建所有视图并在使用后删除此架构即可更轻松地完成这项工作。
      • 谢谢!我对此有点陌生,不知道如何执行功能。我应该在控制台中编写这个函数吗?我的视图架构是 pg_temp_3
      • 我给出的示例使用了一个匿名代码块,更多的是用于临时使用。您可以按原样运行它而无需将其投入使用。只需通过 psql 或 pgadmin 登录到您的数据库,然后将语句粘贴到控制台(psql)或 gui(pgadmin)中并运行它。如果您想使用函数,请阅读此postgresql.org/docs/9.1/static/sql-syntax-calling-funcs.html
      【解决方案4】:

      您可以像这样从元表中选择视图(如果您使用旧版本,实际选择可能会有所不同,请参见此处,例如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 文件。

      【讨论】:

      • 执行后...hw我要把这个写入sql文件吗?复制粘贴?
      • psql - 将命令结果保存到文件stackoverflow.com/questions/5331320/…
      • 如果某些视图引用了其他视图,可能需要'DROP VIEW ' || table_name || ' CASCADE;'
      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2011-08-02
      • 2012-10-24
      • 1970-01-01
      • 2012-03-20
      • 2012-06-03
      • 1970-01-01
      相关资源
      最近更新 更多