Доступ на чтение можно предоставить через создание специального read-only пользователя. Если пользователю предоставить только право ПОДКЛЮЧЕНИЯ (CONNECT) к базе данных, то подключиться то он сможет, но толку от этого не будет никакого. Поэтому, дополнительно необходимо дать право на ИСПОЛЬЗОВАНИЕ (USAGE) в пространствах имен (схемах) и право на ВЫБОРКИ (SELECT) в таблицах/представлениях как по отдельности, так и ко всем.
Всё нижесказанное работает на PostgreSQL 9.0 и выше. Предполагается, что все действия выполняются в plsql под суперпользователем postgres.
Итак, поехали: создадим пользователя myuser и предоставим ему доступ только на чтение к таблицам БД mydb.
Создание пользователя и общие настройки
-- Создаём роль (пользователя):
CREATE ROLE myuser LOGIN ENCRYPTED PASSWORD 'mypass';
-- Предоставляем право подключения к нужной БД:
GRANT CONNECT ON DATABASE mydb TO myuser;
-- Далее, переключаемся на mydb в psql: \c mydb
-- Предоставляем право использования схемы public:
GRANT USAGE ON SCHEMA public TO myuser;
Дальнейшие действия зависят от того, на что именно требуется доступ — на одну (несколько) таблиц или на все.
Для одной таблицы/представления
-- Выдаём право выполнения выборки из одной таблицы:
GRANT SELECT ON mytable TO myuser;
Для всех таблиц/представлений
В последних версиях PostgreSQL можно предоставлять разрешения для всех таблиц/представлений/etc. в схеме с помощью одной команды вместо того, чтобы вводить их по одной:
-- Выдаём право выполнения выборки из всех таблиц схемы:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser;
Однако, это повлияет только на таблицы, которые уже были созданы. При необходимости автоматического назначения прав на все вновь создаваемые таблицы, делаем так:
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO myuser;
Обратите внимание, что по умолчанию это будет влиять только на объекты (таблицы), созданные пользователем, который выдал эту команду, хотя это также может быть установлено для любой роли, членом которой является выдающий пользователь. Всё это весьма запутанно, и, возможно, придется поэкспериментировать, чтобы создать функциональный рабочий процесс.
Но для 90% случаев этого вполне достаточно. ИМХО.
По мотивам