【问题标题】:How to drop materialized views using EXECUTE statement in PostgreSQL如何在 PostgreSQL 中使用 EXECUTE 语句删除物化视图
【发布时间】:2015-01-23 08:34:26
【问题描述】:

我的数据库是 PostgreSQL (9.3.5)。

我们有 500 多个具体化视图,希望删除其中的一些。
为此,我们从pg_class 的物化视图中获取:

FOR MVNAME IN (SELECT relname
            FROM pg_class
            WHERE relkind='m')

LOOP
   EXECUTE 'DROP MATERIALIZED VIEW '||MVNAME||'';
END LOOP;

在执行时它给了我们一个错误:

ERROR: "dimension" is not a materialized view
SQL state: 42809

Hint: Use DROP FOREIGN TABLE to remove a foreign table.
Context: SQL statement "DROP MATERIALIZED VIEW dimension"
PL/pgSQL function test_drop_dims() line 14 at EXECUTE statement

我们可以使用以下方法删除一个物化视图:

DROP MATERIALIZED VIEW MVNAME;

但我们不能使用EXECUTE 语句删除多个物化视图。

【问题讨论】:

    标签: sql postgresql dynamic-sql postgresql-9.3 materialized-views


    【解决方案1】:

    错误消息表明您使用双引号创建了非标准名称,例如"Dimension"(混合大小写)。您需要在动态 SQL 中正确地引用和转义标识符。不仅因为它不能以任何其他方式工作,还可以避免 SQL 注入
    此外,您可能需要schema-qualify 名称。详情:

    另外,您可以drop multiple MV's at once 并且不需要这样循环:

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

    小心这个!它会在您当前数据库的所有模式中删除所有物化视图。您可能需要先仔细检查。

    注意我是如何使用oid::regclass::text,而不是quote_ident(relname)。这也自动涵盖了架构名称。 Detailed explantaion in the provided link.

    【讨论】:

    • @a_horse_with_no_name:如果您执行语句DROP TABLE dimensionDROP TABLE Dimension(同样的事情),系统如何知道您的真正意思是"Dimension""diMenSion"?错误消息报告您输入的内容,除非双引号,否则折叠为小写,仅此而已。见:sqlfiddle.com/#!15/d41d8/4009
    猜你喜欢
    • 2020-06-24
    • 2018-12-16
    • 2020-09-17
    • 2022-07-07
    • 2021-04-15
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多