在一个查询中删除 Postgresql 9.3 中的普通视图或物化视图

Ale*_*aev 5 postgresql materialized-views sql-drop

I\xe2\x80\x99在我的 PostgreSQL 中有一个视图,它可以是正常的也可以是具体化的,具体取决于某些情况。我正在尝试编写一个查询,该查询肯定会删除视图,并且无论它目前的类型是什么,都不会出现错误。然而,这似乎并不容易。当我尝试使用以下代码时,出现错误:

\n\n
DROP VIEW IF EXISTS {{ schema }}.{{ viewName }};\nDROP MATERIALIZED VIEW IF EXISTS {{ schema }}.{{ viewName }};\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc2\xa0

\n\n
SQLSTATE[42809]: Wrong object type: 7 ERROR:  "{{ viewName }}" is not a view  \nHINT:  Use DROP MATERIALIZED VIEW to remove a materialized view.    \n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,当视图具体化时,\xe2\x80\x98IF EXISTS\xe2\x80\x99 在第一行结果为 true,DROP 命令启动,但由于视图类型错误而失败(这是不正常的) 。谁能提出一种既适用于物化视图又适用于普通视图的通用解决方法?

\n

Den*_*rdy 1

没有。无论如何,这并不容易……正如 Postgres 报道的那样,这两者是不同的动物。

我认为 ifexists 起作用的原因是,这一切都驻留在 pg_class 中。如果您创建一个测试表并尝试运行drop view if exists test,您将收到类似的错误。

作为一个不太好的解决方法,您可以在检查 pg_catalog.pg_class 中实体的类型以确定您正在处理的内容的精确类型(表、视图、mat 视图)之后在 DO 块中生成动态 SQL 语句, ETC。)。