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 [, ...]