Перейти к основному содержимому

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 [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| SYSID uid

Описание

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

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

Во время создания роли возможно сразу назначить вновь созданную роль членом существующей роли, а также назначить существующие роли членами новой созданной роли. Правила, определяющие, какие начальные параметры членства ролей разрешены, описаны ниже в пунктах IN ROLE, ROLE и ADMIN. Команда GRANT имеет тонкую настройку опций при создании членства и возможность изменять их после создания новой роли.

Параметры

name
Указывает имя роли, которая должна быть создана.
SUPERUSER
NOSUPERUSER
Указывает, является ли роль суперпользователем, способным обходить все ограничения доступа. Параметр опасен и должен назначаться только при реальной необходимости. По умолчанию используется NOSUPERUSER. Только суперпользователь может создать другую суперпользовательскую роль.
CREATEDB
NOCREATEDB
Определяет, может ли роль создавать базы данных. По умолчанию — NOCREATEDB. Только роли суперпользователей или роли с атрибутом CREATEDB могут указать CREATEDB.
CREATEROLE
NOCREATEROLE
Указывает, может ли роль создавать, изменять, удалять другие роли, а также управлять их членством. По умолчанию — NOCREATEROLE. Смотрите атрибут роли role creation для получения дополнительной информации о том, какие возможности предоставляются этим атрибутом.
INHERIT
NOINHERIT
Это влияет на статус наследования членства, когда эта роль добавляется в качестве члена другой роли, как в текущей команде, так и в последующих командах. В частности, оно управляет статусом наследования членств, добавленных с помощью данной команды с использованием пункта IN ROLE, и в более поздних командах с использованием пункта ROLE. Оно также используется в качестве значения статуса наследования по умолчанию при добавлении этой роли в члены с помощью команды GRANT. Если явно не указано иное, по умолчанию принимается значение INHERIT.

В версиях PostgreSQL до версии 16 наследование было атрибутом уровня роли, который контролировал все проверки членства времени выполнения для этой роли.

LOGIN
NOLOGIN
Указывает, может ли роль использоваться для входа в систему. Роли с атрибутом LOGIN считаются пользователями. Роли без этого атрибута полезны для управления привилегиями баз данных, но они не являются пользователями в обычном смысле этого слова. По умолчанию — NOLOGIN, за исключением случая использования CREATE USER.
REPLICATION
NOREPLICATION
Определяет, является ли роль репликационной. Такая роль может подключаться в режиме репликации и управлять слотами репликации. Роль с атрибутом REPLICATION является очень высоко привилегированной ролью и должна использоваться только на ролях, которые фактически используются для репликации. Выдавать атрибут REPLICATION могут только суперпользователи или роли с REPLICATION. По умолчанию — NOREPLICATION.
BYPASSRLS
NOBYPASSRLS
Указывает, может ли роль обходить политику контроля доступа на уровне строк (RLS). По умолчанию — NOBYPASSRLS. Выдавать атрибут BYPASSRLS могут только суперпользователи или роли с 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
Пункт IN ROLE автоматически добавляет новую роль в качестве члена указанных существующих ролей. Новое членство будет иметь параметр SET установленным в состояние включено, а параметр ADMIN – выключено. Параметр INHERIT будет включен, если не указан параметр NOINHERIT.
IN GROUP role_name
Является устаревшим написанием IN ROLE.
ROLE role_name
Пункт ROLE приводит к автоматическому добавлению одной или нескольких указанных существующих ролей в качестве членов с параметром SET установленным в состояние включено. Фактически это делает новую роль «группой». Названные в этом пункте роли с атрибутом INHERIT на уровне роли будут иметь параметр INHERIT установленным в состоянии включено в новом членстве. Новые членства будут иметь параметр ADMIN отключенным.
ADMIN role_name
Пункт ADMIN действует аналогично пункту ROLE, но указанные роли добавляются в члены новой роли с параметром ADMIN установленным в состояние включено, что дает им право предоставлять членам доступ к новой роли.
USER role_name
Является устаревшим написанием ROLE.
SYSID uid
Является устаревшим параметром, игнорируется, но поддерживается ради совместимости.

Примечания

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

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

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

Атрибуты роли, определенные здесь, являются невоспроизводимыми, то есть членство в роли с, например, CREATEDB не позволит участнику создавать новые базы данных даже если предоставление членства имеет опцию INHERIT. Конечно, если предоставление членства имеет опцию SET, роль участника сможет SET ROLE к созданной базе данных и затем создать новую базу данных.

Членские гранты, созданные предложениями IN ROLE, ROLE и ADMIN, имеют исполнителя этой команды в качестве предоставляющего права доступа.

Атрибут 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, наиболее близко приближается путем создания стандартных пользователей SQL как PostgreSQL-ролей с параметром NOINHERIT, а стандартные роли SQL — как PostgreSQL-роли с параметром INHERIT.

Предложение USER ведет себя так же, как ROLE, но устарело:

USER role_name [, ...]

Предложение IN GROUP ведет себя так же, как IN ROLE, но устарело:

IN GROUP role_name [, ...]

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

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