CREATE ROLE

CREATE ROLE — определить новую роль в базе данных


Синтаксис

CREATE ROLE имя [ [ WITH ] параметр [ ... ] ]

где параметром может быть:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT предел_подключений
    | [ ENCRYPTED ] PASSWORD 'пароль' | PASSWORD NULL
    | VALID UNTIL 'метка_времени'
    | IN ROLE имя_роли [, ...]
    | IN GROUP имя_роли [, ...]
    | ROLE имя_роли [, ...]
    | ADMIN имя_роли [, ...]
    | USER имя_роли [, ...]
    | SYSID uid

Описание

Команда CREATE ROLE добавляет новую роль в кластер баз данных QHB. Роль — это сущность, которая может владеть объектами базы данных и иметь некоторые права в базе данных; роль может рассматриваться как «пользователь», «группа» или и то, и другое, в зависимости от того, как она используется. Информацию об управлении пользователями и аутентификации см. в главах Роли в базе данных и Аутентификация клиентского приложения. Чтобы выполнить эту команду, нужно быть суперпользователем базы данных или иметь право CREATEROLE.

Обратите внимание, что роли определяются на уровне кластера баз данных и поэтому действительны во всех базах данных в кластере.


Параметры

имя

Имя новой роли.

SUPERUSER
NOSUPERUSER

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

CREATEDB
NOCREATEDB

Эти предложения определяют способность роли создавать базы данных. Если указывается CREATEDB, то определяемой роли будет разрешено создавать новые базы данных. NOCREATEDB лишит роль возможности создавать базы данных. Если ничего не указано, значение по умолчанию равно NOCREATEDB.

CREATEROLE
NOCREATEROLE

Эти предложения определяют, будет ли роли разрешено создавать новые роли (то есть выполнять CREATE ROLE). Роль с правом CREATEROLE может также изменять и удалять другие роли. Если ничего не указано, значение по умолчанию равно NOCREATEROLE.

INHERIT
NOINHERIT

Эти предложения определяют, «наследует» ли роль права ролей, членом которых является. Роль с атрибутом INHERIT может автоматически использовать любые права в базе данных, предоставленные всем ролям, в которые она непосредственно или опосредованно входит. Без INHERIT членство в другой роли позволяет только выполнить SET ROLE и переключиться на эту роль; права, назначенные другой роли, будут доступны только после этого. Значение по умолчанию равно INHERIT.

LOGIN
NOLOGIN

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

REPLICATION
NOREPLICATION

Эти предложения определяют, является ли роль ролью репликации. Роль должна иметь этот атрибут (или быть суперпользователем), чтобы иметь возможность подключаться к серверу в режиме репликации (физической или логической), а также создавать или удалять слоты репликации. Роль с атрибутом REPLICATION обладает очень большими правами и должна использоваться только в ролях, фактически используемых для репликации. Если ничего не указано, значение по умолчанию равно NOREPLICATION. Чтобы создать новую роль с атрибутом REPLICATION, нужно быть суперпользователем.

BYPASSRLS
NOBYPASSRLS

Эти предложения определяют, будут ли для роли игнорироваться все политики защиты на уровне строк (row-level security, RLS). Значение по умолчанию равно NOBYPASSRLS. Чтобы создать новую роль с атрибутом BYPASSRLS, нужно быть суперпользователем.

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

CONNECTION LIMIT предел_подключений

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

[ ENCRYPTED ] PASSWORD 'пароль' \
PASSWORD NULL

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

Примечание
При указании пустой строки пароль также будет иметь значение NULL. Чтобы избежать двусмысленности, следует избегать указания пустой строки.

Пароль всегда хранится зашифрованным в системных каталогах. Ключевое слово ENCRYPTED не имеет эффекта, но принимается для обратной совместимости. Способ шифрования определяется параметром конфигурации password_encryption. Если представленная строка пароля уже зашифрована в формате MD5 или SCRAM, она сохраняется как есть независимо от password_encryption (поскольку система не может расшифровать указанную зашифрованную строку пароля, чтобы зашифровать ее в другом формате). Это позволяет перезагружать зашифрованные пароли во время выгрузки/восстановления.

VALID UNTIL 'метка_времени'

Предложение VALID UNTIL устанавливает дату и время, после которых пароль роли становится недействительным. Если это предложение опущено пароль будет действителен в течение всего времени.

IN ROLE имя_роли

В предложении IN ROLE перечисляются одна или несколько существующих ролей, к которым новая роль будет немедленно добавлена в качестве нового члена. (Обратите внимание, что нет возможности добавить новую роль в качестве администратора; для этого используйте отдельную команду GRANT).

IN GROUP имя_роли

IN GROUP — это устаревшее написание предложения IN ROLE.

ROLE имя_роли

В предложении ROLE перечислены одна или несколько существующих ролей, которые автоматически добавляются в качестве членов новой роли. (Это фактически делает новую роль «группой».)

ADMIN имя_роли

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

USER имя_роли

Предложение USER является устаревшим написанием предложения ROLE.

SYSID uid

Предложение SYSID игнорируется, но принимается для обратной совместимости.


Примечания

Используйте команду ALTER ROLE, чтобы изменить атрибуты роли, и DROP ROLE, чтобы ее удалить. Все атрибуты, указанные в CREATE ROLE, могут быть позднее изменены командами ALTER ROLE.

Предпочтительным способом добавления и удаления членов ролей, используемых в качестве групп, является использование команд GRANT и REVOKE.

Предложение VALID UNTIL определяет срок действия только для пароля, а не для роли как таковой. В частности, при входе в систему с помощью метода аутентификации без пароля ограничение срока действия пароля не действует.

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

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

Будьте осторожны с правом CREATEROLE, т. к. на роли с этим правом не распространяется концепция наследования прав. Это означает, что даже если у роли нет определенных прав, но ей все равно разрешено создавать другие роли, она может легко создать другую роль с правами, отличными от тех, что есть у нее самой (за исключением создания ролей с правами суперпользователя). Например, если роль «user» имеет право CREATEROLE, но не CREATEDB, она, тем не менее, может создать новую роль с правом CREATEDB. Поэтому роль с правом CREATEROLE следует воспринимать почти как роль суперпользователя.

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

Ограничение CONNECTION LIMIT действует только приблизительно; если одновременно запускаются два сеанса, в то время как для этой роли остается только один «слот», может так случиться, что будут отклонены оба подключения. Кроме того, это ограничение не распространяется на суперпользователей.

При указании с помощью этой команды незашифрованного пароля следует соблюдать осторожность. Пароль будет передан на сервер открытым текстом, и он также может быть зарегистрирован в журнале команд клиента или в журнале сервера. Однако команда createuser передает зашифрованный пароль. Кроме того, psql содержит команду \password, которую можно использовать для последующего безопасного изменения пароля.


Примеры

Создание роли, для которой разрешен вход, но не задан пароль:

CREATE ROLE jonathan LOGIN;

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

CREATE USER davide WITH PASSWORD 'jw8s0F4';

(CREATE USER действует так же, как CREATE ROLE, но подразумевает еще и атрибут LOGIN.)

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

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

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

CREATE ROLE admin WITH CREATEDB CREATEROLE;

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

Команда CREATE ROLE описана в стандарте SQL, но стандарт требует поддержки только следующего синтаксиса:

CREATE ROLE имя [ WITH ADMIN имя_роли ]

Возможность создавать множество начальных администраторов и все другие параметры CREATE ROLE относятся к расширениям QHB.

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

Поведение, заданное стандартом SQL, с наибольшей достоверностью можно получить, если создавать пользователей с атрибутом NOINHERIT, а роли — с атрибутом INHERIT.


См. также

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