我的问题与此有关:如何锁定表进行写入
我找到了简单的解决方案,但是我不确定副作用是否安全。
所以:
update pg_class set relkind = 'm' where relname = '';
(当然,考虑到表模式应该更复杂)
但是在我的简单测试中,它可以解决这个问题:
create table t(i int); insert into t values(1); update pg_class set relkind = 'm' where relname = 't'; insert into t values(1); -- ERROR: cannot change materialized view "t" select * from t; -- i -- --- -- 1 -- (1 row)
因此,我的问题(目前仅是理论上的)是:此解决方案是否可能出问题?
是的,事情可能会出错。
Postgres永远不会通过DDL命令允许这种状态,现在它的行为基本上是不确定的。
一方面,每个物化视图都应具有关联的定义,因此pg_dump
现在崩溃,抱怨definition of view "t" appears to be empty (length zero)
。
您的“物化视图”可能还具有列默认值,约束,触发器和许多其他内容,这些内容永远都不会通过DDL允许,这可能会导致一系列问题。
如果要将表设为只读,请设置适当的权限,或拒绝触发器中的任何更改。