创建一个VIEW 作为超级用户或某个受信任的角色:
CREATE VIEW onerow AS SELECT 'bar' AS foo; -- defaults to type text
GRANT SELECT ON onerow TO public;
创造者就是拥有者。或者:
ALTER VIEW onerow OWNER TO postgres; -- or to a trusted role
每个人都可以通过它SELECT 就像在任何其他表格中一样。
没有人可以在 VIEW 中添加或删除行 - 甚至无法使用 DDL 命令更改任何内容。
只有 DML 命令可以更改它,并且只有所有者或超级用户可以这样做:
CREATE OR REPLACE VIEW onerow AS
SELECT 'bar1' AS foo;
请记住,最终,一个有动力的超级用户可以做任何事情。
在一个非常繁忙的系统上,CREATE OR REPLACE VIEW 占用的排他锁可能是个问题。这是我能想到的这个解决方案唯一可能出现的问题。
或者,考虑这个密切相关的答案以允许最多一行:
您可以这样做并且(作为超级用户):
ALTER TABLE onerow OWNER TO postgres;
REVOKE ALL ON onerow FROM public;
GRANT SELECT ON onerow TO public;
超级用户仍然可以DELETE 或TRUNCATE。您也可以使用TRIGGER 或RULE 来防止这种情况发生...
或者您可以为INSERT 和DELETE 添加通用TRIGGER 和RETURN NULL 或RULE 和DO INSTEAD NOTHING ...
一个单一的值也可以由函数或“全局变量”提供。见: