CREATE ROLE#

Примечание

Эта страница переведена при помощи нейросети GigaChat.

CREATE ROLE — создание новой роли базы данных.

Синтаксис#

CREATE ROLE name [ [ WITH ] option [ ... ] ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

Описание#

CREATE ROLE создает новую роль в кластере баз данных PostgreSQL. Роль — это сущность, которая может владеть объектами базы данных и обладать привилегиями. В зависимости от использования, роль может представлять собой как пользователя, так и группу, или одновременно и то и другое. Обратитесь к разделам «Роли баз данных» и «Аутентификация клиентов» для получения информации о управлении пользователями и аутентификации.

Для выполнения команды необходимо иметь привилегию CREATEROLE либо быть суперпользователем. Роли задаются на уровне кластера, и действуют во всех базах данных, входящих в этот кластер.

Параметры#

name

Указывает имя роли, которая должна быть создана.

SUPERUSER
NOSUPERUSER

Указывает, является ли роль суперпользователем, способным обходить все ограничения доступа. Параметр опасен и должен назначаться только при реальной необходимости. По умолчанию используется NOSUPERUSER. Только суперпользователь может создать другую суперпользовательскую роль.

CREATEDB
NOCREATEDB

Определяет, может ли роль создавать базы данных. По умолчанию — NOCREATEDB.

CREATEROLE
NOCREATEROLE

Указывает, может ли роль создавать, изменять, удалять другие роли, а также управлять их членством. По умолчанию — NOCREATEROLE. Смотрите атрибут роли role creation для получения дополнительной информации о том, какие возможности предоставляются этим атрибутом.

INHERIT
NOINHERIT

Определяет, будет ли роль автоматически наследовать привилегии других ролей, в которых она состоит. Без INHERIT необходимо явно выполнять SET ROLE, чтобы использовать привилегии другой роли. По умолчанию — INHERIT.

LOGIN
NOLOGIN

Указывает, может ли роль использоваться для входа в систему. Роли с атрибутом LOGIN считаются пользователями. Роли без этого атрибута полезны для управления привилегиями баз данных, но они не являются пользователями в обычном смысле этого слова. По умолчанию — NOLOGIN, за исключением случая использования CREATE USER.

REPLICATION
NOREPLICATION

Определяет, является ли роль репликационной. Такая роль может подключаться в режиме репликации и управлять слотами репликации. Роль с атрибутом REPLICATION является очень высоко привилегированной ролью и должна использоваться только на ролях, которые фактически используются для репликации. Только суперпользователь может назначить этот атрибут. По умолчанию — NOREPLICATION.

BYPASSRLS
NOBYPASSRLS

Указывает, может ли роль обходить политику контроля доступа на уровне строк (RLS). По умолчанию — NOBYPASSRLS. Только суперпользователь может создать роль с BYPASSRLS.

Обратите внимание: утилита pg_dump по умолчанию отключает политику RLS с помощью параметра row_security = OFF, чтобы гарантировать выгрузку всех строк таблицы. Если у пользователя, запускающего pg_dump, нет соответствующих прав доступа, будет возвращена ошибка. Однако суперпользователи и владелец выгружаемой таблицы всегда обходят ограничения RLS.

CONNECTION LIMIT connlimit

Ограничивает количество одновременных подключений для роли с атрибутом LOGIN. Значение -1 (по умолчанию) означает отсутствие ограничения. Подсчет касается только обычных соединений, соединения фоновых рабочих процессов и подготовленные транзакции не учитываются.

[ENCRYPTED] PASSWORD 'password'
PASSWORD NULL

Задает пароль роли. Пароль имеет смысл только для ролей с атрибутом LOGIN, однако его можно задать и для других ролей. Если не планируете использовать аутентификацию по паролю, этот параметр можно не указывать. При отсутствии пароля значение по умолчанию — NULL, и попытки входа с паролем для такой роли всегда будут завершаться неудачей. Также можно явно задать PASSWORD NULL.

Примечание

Указание пустой строки в качестве пароля также приведет к установке значения NULL. Однако до версии PostgreSQL 10 это работало иначе: поведение зависело от используемого метода аутентификации и версии клиента, а библиотека libpq могла отказать в использовании пустого пароля. Чтобы избежать неоднозначности, не рекомендуется использовать пустую строку в качестве пароля.

Пароль всегда сохраняется в системных каталогах в зашифрованном виде. Ключевое слово ENCRYPTED не оказывает влияния и поддерживается только для совместимости с предыдущими версиями. Метод преобразования определяется параметром конфигурации password_encryption.

Если указанный пароль уже представлен в формате MD5 или SCRAM (то есть в преобразованном виде), он сохраняется как есть, вне зависимости от значения password_encryption, поскольку система не может прочитать такой пароль, чтобы преобразовать его заново. Это поведение позволяет корректно восстанавливать роли из дампа, содержащего преобразованные пароли.

VALID UNTIL 'timestamp'

Устанавливает дату и время, после которых пароль роли станет недействительным. Это не влияет на саму роль, только на срок действия пароля.

IN ROLE role_name

Включает новую роль в состав одной или нескольких существующих ролей. Административные права при этом не передаются — для этого используется команда GRANT.

IN GROUP role_name

Является устаревшим написанием IN ROLE.

ROLE role_name

Указывает роли, которые будут членами новой роли (новая роль становится группой).

ADMIN role_name

Действует аналогично ROLE, но указанные роли добавляются в новую роль WITH ADMIN OPTION, предоставляя им право предоставлять членство в этой роли другим пользователям.

USER role_name

Является устаревшим написанием ROLE.

SYSID uid

Является устаревшим параметром, игнорируется, но поддерживается ради совместимости.

Примечания#

Для изменения роли используйте ALTER ROLE, для удаления — DROP ROLE.

Для управления группами предпочтительнее использовать GRANT и REVOKE.

VALID UNTIL влияет только на срок действия пароля, а не на срок действия самой роли. Срок действия не применяется при входе с использованием метода аутентификации, который не основан на пароле.

Атрибут INHERIT распространяется только на обычные привилегии (доступ к объектам и членство в ролях), но не распространяется на специальные атрибуты ролей, , установленным с помощью CREATE ROLE и ALTER ROLE. Например, быть членом роли с привилегией CREATEDB сразу не дает возможности создавать базы данных, даже если установлен INHERIT. Необходимо было бы стать этой ролью через SET ROLE, прежде чем создать базу данных.

INHERIT включен по умолчанию из соображений обратной совместимости, хотя NOINHERIT ближе к стандарту SQL.

Роли с привилегией CREATEROLE следует использовать осторожно: они могут создавать роли с правами, которых сами не имеют (кроме SUPERUSER). Например, если роль user имеет привилегию CREATEROLE, но не имеет привилегии CREATEDB, тем не менее она может создать новую роль с привилегией CREATEDB.

Утилита командной строки createuser имеет ту же функциональность, что и CREATE ROLE (фактически, она вызывает эту команду), но может быть запущена из командной оболочки.

Параметр CONNECTION LIMIT работает приблизительно. Если два новых сеанса начинаются примерно одновременно, когда для роли остается всего одно «свободное место» подключения, возможно, оба завершатся неудачно. Суперпользователи этому ограничению не подчиняются.

При передаче пароля открытым текстом (через SQL) следует проявлять осторожность: он может попасть в историю команд. Лучше использовать команду \password в psql, которая передает пароль безопасно.

Примеры#

Создание роли с возможностью входа в систему, но без пароля:

CREATE ROLE jonathan LOGIN;

Создание роли с паролем:

CREATE USER davide WITH PASSWORD 'jw8s0F4';

CREATE USER аналогичен CREATE ROLE, за исключением того, что он подразумевает LOGIN.

Создание роли с паролем, действующим до конца 2004 года:

CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';

Создание роли с правами на создание баз и управление ролями:

CREATE ROLE admin WITH CREATEDB CREATEROLE;

Совместимость#

Команда CREATE ROLE присутствует в стандарте SQL, но в стандарте описана только часть синтаксиса:

CREATE ROLE name [ WITH ADMIN role_name ]

Возможность указать сразу нескольких администраторов, а также все остальные дополнительные параметры команды CREATE ROLE — это расширения, специфичные для PostgreSQL.

Стандарт SQL различает пользователей и роли как отдельные сущности и не устанавливает универсальных команд для создания пользователей — это оставлено на усмотрение конкретных реализаций СУБД. В PostgreSQL пользователи и роли объединены в одну сущность — роль. Благодаря этому роли в PostgreSQL обладают гораздо более широким набором атрибутов, чем предусмотрено стандартом.

Поведение, близкое к тому, как его описывает стандарт SQL, достигается путем назначения ролям атрибута INHERIT, а пользователям — NOINHERIT.

Смотрите также#

SET ROLE, ALTER ROLE, DROP ROLE, GRANT, REVOKE, createuser