Предоставить использование / выбрать одну таблицу
Если вы только предоставляете CONNECT для базы данных, пользователь может подключиться, но не имеет других привилегий. Вы должны предоставить USAGE для пространств имен (схем) и SELECT для таблиц и представлений по отдельности, например:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
Несколько таблиц / представлений (PostgreSQL 9.0 +)
В последних версиях PostgreSQL вы можете предоставлять разрешения для всех таблиц / представлений / и т. Д. В схеме, используя одну команду, вместо того, чтобы вводить их по одному:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Это влияет только на таблицы, которые уже были созданы. Более эффективно, вы можете автоматически назначить роли по умолчанию для новых объектов в будущем:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
Обратите внимание, что по умолчанию это повлияет только на объекты (таблицы), созданные пользователем, который выполнил эту команду: хотя она также может быть установлена для любой роли, членом которой является выдавший пользователь. Однако вы не выбираете привилегии по умолчанию для всех ролей, в которых вы участвуете, при создании новых объектов ... так что все еще есть некоторые недоработки. Если вы принимаете подход, согласно которому база данных играет роль-владелец, а изменения схемы выполняются в качестве этой роли-владельца, вам следует назначить привилегии по умолчанию для этой роли-владельца. ИМХО, это немного сбивает с толку, и вам, возможно, придется поэкспериментировать, чтобы придумать функциональный рабочий процесс.
Несколько таблиц / представлений (версии PostgreSQL до 9.0)
Чтобы избежать ошибок при длительных изменениях в нескольких таблицах, рекомендуется использовать следующий «автоматический» процесс для генерации требуемого GRANT SELECT
для каждой таблицы / представления:
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
Это должно вывести соответствующие команды GRANT в GRANT SELECT для всех открытых таблиц, представлений и последовательностей для копирования-n-paste. Естественно, это будет применяться только к таблицам, которые уже были созданы.