PostgreSQL: создать пользователя и выдать права

Категория: Postgresql · Язык: SQL · Обновлено:

В PostgreSQL пользователя создают командой CREATE ROLE ... LOGIN, затем выдают только нужные права на базу, схему и таблицы. Не используйте суперпользователя для приложения; пароли и команды с секретами не храните в истории shell или репозитории.

Создать роль и базу для приложения

SQL
CREATE ROLE app_user LOGIN PASSWORD 'replace-with-a-secret';
CREATE DATABASE app_db OWNER app_user;

Если база уже создана другим владельцем, выдайте права явно:

SQL
-- Подключитесь к базе app_db перед выдачей прав на её схему и таблицы.
GRANT CONNECT ON DATABASE app_db TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;

Выполняйте команды с правами владельца базы/объектов. Права на текущие таблицы не распространяются автоматически на будущие таблицы.

Права для будущих таблиц

SQL
CREATE ROLE app_owner;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA public
  GRANT USAGE, SELECT ON SEQUENCES TO app_user;

FOR ROLE app_owner должен совпадать с ролью, которая будет создавать объекты. Выполните настройку отдельно для каждой роли-создателя.

Возможность

Команда

Подключиться к базе

GRANT CONNECT ON DATABASE

Использовать схему

GRANT USAGE ON SCHEMA

Читать/изменять текущие таблицы

GRANT ... ON ALL TABLES

Права на будущие объекты

ALTER DEFAULT PRIVILEGES

Почему пользователь не видит таблицу?

Проверьте CONNECT на базу, USAGE на схему и SELECT на нужную таблицу. Убедитесь, что запрос идёт к правильной базе и схеме.

Как отозвать доступ?

Используйте REVOKE для конкретного объекта и проверьте наследуемые права роли. Удаление роли потребует сначала переприсвоить или удалить принадлежащие ей объекты.