PostgreSQL:只读表

Abe*_*sto 0 postgresql

我的问题与此有关:如何锁定表进行写入

我找到了简单的解决方案,但是我不确定副作用是否安全。

所以:

update pg_class set relkind = 'm' where relname = '<table_name>';
Run Code Online (Sandbox Code Playgroud)

(当然,考虑到表模式应该更复杂)

但是在我的简单测试中,它可以解决这个问题:

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)
Run Code Online (Sandbox Code Playgroud)

因此,我的问题(目前仅是理论上的)是:此解决方案是否可能出问题?

Nic*_*nes 5

是的,事情可能会出错。

Postgres永远不会通过DDL命令允许这种状态,现在它的行为基本上是不确定的。

一方面,每个物化视图都应具有关联的定义,因此pg_dump现在崩溃,抱怨definition of view "t" appears to be empty (length zero)

您的“物化视图”可能还具有列默认值,约束,触发器和许多其他内容,这些内容永远都不会通过DDL允许,这可能会导致一系列问题。

如果要将表设为只读,请设置适当的权限,或拒绝触发器中的任何更改。