Я забыл, в какой версии PostgreSQL добавлен синтаксис, но один из самых простых способов администрирования разрешений в PostgreSQL - через синтаксис "GRANT foo, priv ON ALL что-то в SCHEMA".
BEGIN;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_schema TO my_role;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA my_schema TO my_role;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA my_schema TO my_role;
COMMIT;
Очень удобно для проверки правильности установки разрешений.
EXECUTE for FUNCTIONS может показаться жутким, но этого не должно быть, если ваши функции не были созданы с помощью атрибута SECURITY DEFINER (и если вы используете SECURITY DEFINER, вам следует быть осторожным, поскольку вы играете с PostgreSQL версия функции "setuid"). Если вы распределите ваши TABLES по разным SCHEMAS на основе ожидаемых разрешений, это станет довольно удобным соглашением при использовании с переменной search_path.
ALTER ROLE my_role SET search_path = my_schema, auth_schema, public;
-- Avoid using the public schema (pretty please)
Где auth_schema имеет коллекцию таблиц, на которые my_role не должен иметь права прямого чтения или записи. Назначение привилегий для групп также полезно.
Вот некоторые соответствующие документы:
http://developer.postgresql.org/pgdocs/postgres/sql-grant.html
Не забывайте, что вы можете использовать "\ h GRANT" в psql, чтобы легко выяснить синтаксис или запомнить, что можно сделать со всеми объектами в схеме (поиск "IN SCHEMA").