CREATE ROLE#
CREATE ROLE
CREATE ROLE — определить новую роль базы данных
Синтаксис
CREATE ROLEname
[ [ WITH ]option
[ ... ] ] whereoption
can be: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMITconnlimit
| [ ENCRYPTED ] PASSWORD 'password
' | PASSWORD NULL | VALID UNTIL 'timestamp
' | IN ROLErole_name
[, ...] | IN GROUProle_name
[, ...] | ROLErole_name
[, ...] | ADMINrole_name
[, ...] | USERrole_name
[, ...] | SYSIDuid
Описание
CREATE ROLE
добавляет новую роль в кластер базы данных Tantor SE. Роль - это сущность, которая может владеть объектами базы данных и иметь привилегии доступа к базе данных; роль может рассматриваться как “пользователь”, “группа” или и то, и другое, в зависимости от способа использования. См. разделы Глава 21 и Глава 20 для получения информации о управлении пользователями и аутентификации. Для использования этой команды необходимо иметь привилегию CREATEROLE
или быть суперпользователем базы данных.
Обратите внимание, что роли определяются на уровне кластера баз данных и, следовательно, действительны во всех базах данных в кластере.
Параметры
name
Имя новой роли.
SUPERUSER
NOSUPERUSER
Эти предложения определяют, является ли новая роль “суперпользователем”, который может обойти все ограничения доступа в базе данных. Статус суперпользователя опасен и следует использовать только при реальной необходимости. Чтобы создать нового суперпользователя, вы должны быть суперпользователем. Если не указано,
NOSUPERUSER
является значением по умолчанию.CREATEDB
NOCREATEDB
Эти предложения определяют возможность роли создавать базы данных. Если указано
CREATEDB
, то роль, которая определяется, будет иметь возможность создавать новые базы данных. УказаниеNOCREATEDB
запретит роли возможность создания баз данных. Если не указано, по умолчанию используетсяNOCREATEDB
.CREATEROLE
NOCREATEROLE
Эти предложения определяют, будет ли разрешено роли создавать, изменять, удалять, комментировать, изменять метку безопасности и предоставлять или отзывать членство в других ролях. См. role creation для получения более подробной информации о том, какие возможности предоставляются этим привилегией. Если не указано, по умолчанию используется
NOCREATEROLE
.INHERIT
NOINHERIT
Эти предложения определяют, наследует ли роль “привилегии” ролей, к которым она принадлежит. Роль с атрибутом
INHERIT
может автоматически использовать все привилегии базы данных, предоставленные всем ролям, к которым она прямо или косвенно принадлежит. БезINHERIT
членство в другой роли дает только возможностьSET ROLE
для этой другой роли; привилегии другой роли становятся доступными только после этого. Если не указано,INHERIT
является значением по умолчанию.LOGIN
NOLOGIN
Эти предложения определяют, разрешено ли роли выполнять вход; то есть, может ли роль быть указана в качестве имени начальной сессии авторизации во время подключения клиента. Роль с атрибутом
LOGIN
можно рассматривать как пользователя. Роли без этого атрибута полезны для управления привилегиями базы данных, но не являются пользователями в обычном смысле этого слова. Если не указано,NOLOGIN
является значением по умолчанию, за исключением случая, когдаCREATE ROLE
вызывается через его альтернативное написаниеCREATE USER
.REPLICATION
NOREPLICATION
Эти предложения определяют, является ли роль ролью репликации. Роль должна иметь этот атрибут (или быть суперпользователем), чтобы иметь возможность подключаться к серверу в режиме репликации (физической или логической репликации) и иметь возможность создавать или удалять слоты репликации. Роль, имеющая атрибут
REPLICATION
, является очень привилегированной ролью и должна использоваться только для ролей, фактически используемых для репликации. Если не указано,NOREPLICATION
является значением по умолчанию. Чтобы создать новую роль с атрибутомREPLICATION
, вы должны быть суперпользователем.BYPASSRLS
NOBYPASSRLS
Эти предложения определяют, обходит ли роль политику защиты на уровне строк (RLS).
NOBYPASSRLS
является значением по умолчанию. Для создания новой роли с атрибутомBYPASSRLS
необходимо быть суперпользователем.Обратите внимание, что по умолчанию pg_dump устанавливает
row_security
в значениеOFF
, чтобы гарантировать полный выгрузку содержимого таблицы. Если пользователь, запускающий pg_dump, не имеет соответствующих разрешений, будет возвращена ошибка. Однако суперпользователи и владелец выгружаемой таблицы всегда обходят RLS.CONNECTION LIMIT
connlimit
Если роль может войти в систему, это определяет, сколько одновременных соединений может установить роль. Значение -1 (по умолчанию) означает отсутствие ограничений. Обратите внимание, что это ограничение применяется только к обычным соединениям. Подготовленные транзакции и соединения фоновых процессов не учитываются при подсчете этого ограничения.
- [
ENCRYPTED
]PASSWORD
'password
'PASSWORD NULL
Устанавливает пароль для роли. (Пароль имеет смысл только для ролей с атрибутом
LOGIN
, но вы все равно можете задать его для ролей без этого атрибута). Если вы не планируете использовать аутентификацию по паролю, вы можете опустить эту опцию. Если пароль не указан, то он будет установлен в значение null, и аутентификация по паролю всегда будет неудачной для данного пользователя. Нулевой пароль можно явно записать какPASSWORD NULL
.Примечание
Указание пустой строки также установит пароль в значение null, но это не было так до версии 10 PostgreSQL. В более ранних версиях пустая строка могла использоваться или нет в зависимости от метода аутентификации и конкретной версии, и в любом случае libpq отказывалась ее использовать. Чтобы избежать неоднозначности, следует избегать указания пустой строки.
Всегда сохраняйте пароль в зашифрованном виде в системных каталогах. Ключевое слово
ENCRYPTED
не имеет эффекта, но принимается для обратной совместимости. Метод шифрования определяется параметром конфигурации password_encryption. Если представленная строка пароля уже в формате MD5-шифрования или SCRAM-шифрования, то она сохраняется как есть, независимо от значенияpassword_encryption
(поскольку система не может расшифровать указанную зашифрованную строку пароля, чтобы зашифровать ее в другом формате). Это позволяет перезагрузку зашифрованных паролей во время выполнения операций дампа/восстановления.VALID UNTIL
'timestamp
'Предложение
VALID UNTIL
устанавливает дату и время, после которых пароль роли больше не будет действителен. Если эта предложение не указана, пароль будет действителен всегда.IN ROLE
role_name
Предложение
IN ROLE
перечисляет одну или несколько существующих ролей, к которым новая роль будет немедленно добавлена в качестве нового члена. (Обратите внимание, что нет возможности добавить новую роль в качестве администратора; для этого используйте отдельную командуGRANT
).IN GROUP
role_name
IN GROUP
- это устаревшее написание дляIN ROLE
.ROLE
role_name
Предложение
ROLE
перечисляет одну или несколько существующих ролей, которые автоматически добавляются в качестве членов новой роли. (Это, по сути, делает новую роль “группой”).ADMIN
role_name
Предложение
ADMIN
похожа наROLE
, но именованные роли добавляются к новой ролиWITH ADMIN OPTION
, предоставляя им право назначать членство в этой роли другим пользователям.USER
role_name
Предложение
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
является значением по умолчанию по причине обратной совместимости: в предыдущих версиях Tantor SE пользователи всегда имели доступ ко всем привилегиям групп, к которым они принадлежали. Однако NOINHERIT
более точно соответствует семантике, указанной в стандарте SQL.
Будьте осторожны с привилегией CREATEROLE
. Нет концепции наследования для привилегий роли CREATEROLE
. Это означает, что даже если роль не имеет определенной привилегии, но ей разрешено создавать другие роли, она легко может создать другую роль с другими привилегиями, отличными от ее собственных (за исключением создания ролей с привилегиями суперпользователя). Например, если роль “user” имеет привилегию CREATEROLE
, но не имеет привилегии CREATEDB
, тем не менее она может создать новую роль с привилегией CREATEDB
. Поэтому роли, имеющие привилегию CREATEROLE
, следует рассматривать как роли почти суперпользователя.
Tantor SE включает программу 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 ROLEname
[ WITH ADMINrole_name
]
Несколько начальных администраторов и все остальные параметры команды CREATE ROLE
являются расширениями Tantor SE.
Стандарт SQL определяет понятия пользователей и ролей, но он рассматривает их как отдельные концепции и оставляет все команды, определяющие пользователей, для спецификации каждой реализации базы данных. В Tantor SE мы решили объединить пользователей и роли в один вид сущности. Поэтому роли имеют гораздо больше необязательных атрибутов, чем в стандарте.
Поведение, указанное в стандарте SQL, наиболее точно приближается, если пользователям присваивается атрибут NOINHERIT
, а ролям присваивается атрибут INHERIT
.