如果其他视图依赖它,则在 PostgreSQL 9.3 中编辑物化视图
Editing a Materialized View in PostgreSQL 9.3 if other Views depend on it
我想改变物化视图的一个字段中的值构造。 (例如,对文本字段使用 UPPER() 而不是 LOWER())字段类型和视图的任何属性都不会受到影响。
问题是这个物化视图是主视图。有些视图依赖于它,视图依赖于这些视图等等。由于依赖视图超过 30 个,所以删除此视图是不可能的。
一个丑陋的解决方案是以正确的顺序删除 30 个视图并(重新)创建 30 个视图。
一个很好的解决方案是在一个事务中封装删除和创建主视图,并暂停这段时间的依赖性检查。但在 PostgreSQL 9.3 中,这似乎是不可能的。我说得对吗?
唯一的解决办法是删除并重新创建所有依赖于物化视图的视图。
很遗憾,您无法 "suspend the dependency check" 观看。 (不过你可以对存储过程做类似的事情)。
如果只有少数视图直接依赖于这个实体化视图,但更多依赖于这些(进一步的依赖链),则有一个巧妙的技巧可以将直接依赖项(如果它们本身没有具体化)替换为虚拟值:
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
不更改列名和类型时才有效。从技术角度来看,您可以在现有列之后添加更多列。
替换直接依赖后,您可以删除并重新创建物化视图,然后也恢复这些直接依赖的原始逻辑。
我想改变物化视图的一个字段中的值构造。 (例如,对文本字段使用 UPPER() 而不是 LOWER())字段类型和视图的任何属性都不会受到影响。 问题是这个物化视图是主视图。有些视图依赖于它,视图依赖于这些视图等等。由于依赖视图超过 30 个,所以删除此视图是不可能的。 一个丑陋的解决方案是以正确的顺序删除 30 个视图并(重新)创建 30 个视图。
一个很好的解决方案是在一个事务中封装删除和创建主视图,并暂停这段时间的依赖性检查。但在 PostgreSQL 9.3 中,这似乎是不可能的。我说得对吗?
唯一的解决办法是删除并重新创建所有依赖于物化视图的视图。
很遗憾,您无法 "suspend the dependency check" 观看。 (不过你可以对存储过程做类似的事情)。
如果只有少数视图直接依赖于这个实体化视图,但更多依赖于这些(进一步的依赖链),则有一个巧妙的技巧可以将直接依赖项(如果它们本身没有具体化)替换为虚拟值:
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
不更改列名和类型时才有效。从技术角度来看,您可以在现有列之后添加更多列。
替换直接依赖后,您可以删除并重新创建物化视图,然后也恢复这些直接依赖的原始逻辑。