Создайте 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
...
, или вы можете добавить общее TRIGGER
с RETURN NULL
или RULE
с DO INSTEAD NOTHING
для INSERT
и DELETE
...
Одно отдельное значение может быть альтернативно предоставлено функцией или "глобальной переменной".См .: