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Указывает имя роли, которая должна быть создана.
SUPERUSERNOSUPERUSERУказывает, является ли роль суперпользователем, способным обходить все ограничения доступа. Параметр опасен и должен назначаться только при реальной необходимости. По умолчанию используется
NOSUPERUSER. Только суперпользователь может создать другую суперпользовательскую роль.CREATEDBNOCREATEDBОпределяет, может ли роль создавать базы данных. По умолчанию —
NOCREATEDB.CREATEROLENOCREATEROLEУказывает, может ли роль создавать, изменять, удалять другие роли, а также управлять их членством. По умолчанию —
NOCREATEROLE. Смотрите атрибут роли role creation для получения дополнительной информации о том, какие возможности предоставляются этим атрибутом.INHERITNOINHERITОпределяет, будет ли роль автоматически наследовать привилегии других ролей, в которых она состоит. Без
INHERITнеобходимо явно выполнятьSET ROLE, чтобы использовать привилегии другой роли. По умолчанию —INHERIT.LOGINNOLOGINУказывает, может ли роль использоваться для входа в систему. Роли с атрибутом
LOGINсчитаются пользователями. Роли без этого атрибута полезны для управления привилегиями баз данных, но они не являются пользователями в обычном смысле этого слова. По умолчанию —NOLOGIN, за исключением случая использования CREATE USER.REPLICATIONNOREPLICATIONОпределяет, является ли роль репликационной. Такая роль может подключаться в режиме репликации и управлять слотами репликации. Роль с атрибутом
REPLICATIONявляется очень высоко привилегированной ролью и должна использоваться только на ролях, которые фактически используются для репликации. Только суперпользователь может назначить этот атрибут. По умолчанию —NOREPLICATION.BYPASSRLSNOBYPASSRLSУказывает, может ли роль обходить политику контроля доступа на уровне строк (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.