如果其他视图依赖于它,则在PostgreSQL 9.3中编辑实体化视图

时间:2017-04-04 13:52:16

标签: postgresql postgresql-9.3 materialized-views

我想在物化视图的一个字段中更改值构造。 (例如,对文本字段使用UPPER()而不是LOWER())字段类型和视图的任何属性都不会受到影响。 问题是这个物化视图是主视图。一些视图依赖于它,视图依赖于这些视图等。因此,由于超过30个依赖视图,因此无法删除此视图。 一个丑陋的解决方案是以正确的顺序删除30个视图并(重新)创建30个视图。

一个很好的解决方案是在一个事务中删除和创建主视图的封装,并暂停此期间的依赖性检查。但似乎在PostgreSQL 9.3中这是不可能的。我是对的吗?

2 个答案:

答案 0 :(得分:0)

唯一的解决方案是删除并重新创建依赖于物化视图的所有视图。

答案 1 :(得分:0)

不幸的是,你不能暂停依赖性检查"观点。 (你可以为存储过程做类似的事情。)

如果只有少数视图直接依赖于这个物化视图,但更多依赖于这些(进一步依赖链),有一个巧妙的技巧就是用虚拟值替换直接依赖(如果那些没有实现) :

CREATE OR REPLACE VIEW immediate_dependecy_1 AS
  SELECT NULL::uuid col_alias_1,
         NULL::int  col_alias_2,
         NULL::text col_alias_3,
         ...

注意:这只适用于列名和&类型不会使用此CREATE OR REPLACE VIEW更改。从技术角度来看,您可以在已有的列之后添加更多列。

替换直接依赖项后,您可以删除&重新创建物化视图,然后还原这些直接依赖项的原始逻辑。