【问题标题】:Postgres: Replace a view that has dependenciesPostgres:替换具有依赖项的视图
【发布时间】:2015-07-31 20:36:24
【问题描述】:

我还没有找到一个优雅的解决方案,所以我想知道其他人是否偶然发现了类似的东西。

在 Postgres 中,我有一个由 MyViewB 使用的视图 MyViewA,它由 MyViewC 使用。作为性能改进,我想具体化视图 A,但我找不到一种简单的方法来做到这一点,而无需删除并重新定义整个依赖关系序列。

也就是说,理想情况下,我想这样做:

REPLACE MATERIALIZED VIEW MyViewA AS SELECT...

但不幸的是,Postgres 不允许在同一上下文中使用 REPLACEMATERIALIZED。我尝试了DROP VIEW 然后CREATE MATERIALIZED VIEW,但这当然会导致Postgres 抱怨它cannot drop view MyViewA because other objects depend on it

有什么建议吗?

【问题讨论】:

标签: sql postgresql views ddl


【解决方案1】:

一种方法是创建一个临时视图,修改MyViewB 以使用它,重新定义原始视图并将MyViewB 修改回原始视图,或者如果没有对MyViewA 的查询,只需重命名它,定义一个新的并更改MyViewB

所以假设原件是(非常简化的):

CREATE VIEW MyViewA AS SELECT col1, col2, col3 FROM table;
CREATE VIEW MyViewB AS SELECT col1, col2 FROM MyViewA where col3=1;
CREATE VIEW MyViewC AS SELECT col1 FROM MyViewB where col2='test';

然后你可以像这样修改MyViewA

ALTER VIEW MyViewA RENAME TO MyViewTmp;
CREATE OR REPLACE VIEW MyViewB AS SELECT col1, col2 FROM MyViewTmp where col3=1;
CREATE MATERIALIZED VIEW MyViewA AS SELECT col1, col2, col3 FROM table;
CREATE OR REPLACE VIEW MyViewB AS SELECT col1, col2 FROM MyViewA where col3=1;
DROP VIEW MyViewTmp;

这样你就不需要处理任何依赖视图了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 2022-08-16
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多