CREATE ROLE#
CREATE ROLE
CREATE ROLE — определить новую роль базы данных
Синтаксис
CREATE ROLEname[ [ WITH ]option[ ... ] ] whereoptioncan 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Имя новой роли.
SUPERUSERNOSUPERUSERЭти предложения определяют, является ли новая роль “суперпользователем”, который может обойти все ограничения доступа в базе данных. Статус суперпользователя опасен и следует использовать только при реальной необходимости. Чтобы создать нового суперпользователя, вы должны быть суперпользователем. Если не указано,
NOSUPERUSERявляется значением по умолчанию.CREATEDBNOCREATEDBЭти предложения определяют возможность роли создавать базы данных. Если указано
CREATEDB, то роль, которая определяется, будет иметь возможность создавать новые базы данных. УказаниеNOCREATEDBзапретит роли возможность создания баз данных. Если не указано, по умолчанию используетсяNOCREATEDB.CREATEROLENOCREATEROLEЭти предложения определяют, будет ли разрешено роли создавать, изменять, удалять, комментировать, изменять метку безопасности и предоставлять или отзывать членство в других ролях. См. role creation для получения более подробной информации о том, какие возможности предоставляются этим привилегией. Если не указано, по умолчанию используется
NOCREATEROLE.INHERITNOINHERITЭти предложения определяют, наследует ли роль “привилегии” ролей, к которым она принадлежит. Роль с атрибутом
INHERITможет автоматически использовать все привилегии базы данных, предоставленные всем ролям, к которым она прямо или косвенно принадлежит. БезINHERITчленство в другой роли дает только возможностьSET ROLEдля этой другой роли; привилегии другой роли становятся доступными только после этого. Если не указано,INHERITявляется значением по умолчанию.LOGINNOLOGINЭти предложения определяют, разрешено ли роли выполнять вход; то есть, может ли роль быть указана в качестве имени начальной сессии авторизации во время подключения клиента. Роль с атрибутом
LOGINможно рассматривать как пользователя. Роли без этого атрибута полезны для управления привилегиями базы данных, но не являются пользователями в обычном смысле этого слова. Если не указано,NOLOGINявляется значением по умолчанию, за исключением случая, когдаCREATE ROLEвызывается через его альтернативное написаниеCREATE USER.REPLICATIONNOREPLICATIONЭти предложения определяют, является ли роль ролью репликации. Роль должна иметь этот атрибут (или быть суперпользователем), чтобы иметь возможность подключаться к серверу в режиме репликации (физической или логической репликации) и иметь возможность создавать или удалять слоты репликации. Роль, имеющая атрибут
REPLICATION, является очень привилегированной ролью и должна использоваться только для ролей, фактически используемых для репликации. Если не указано,NOREPLICATIONявляется значением по умолчанию. Чтобы создать новую роль с атрибутомREPLICATION, вы должны быть суперпользователем.BYPASSRLSNOBYPASSRLSЭти предложения определяют, обходит ли роль политику защиты на уровне строк (RLS).
NOBYPASSRLSявляется значением по умолчанию. Для создания новой роли с атрибутомBYPASSRLSнеобходимо быть суперпользователем.Обратите внимание, что по умолчанию pg_dump устанавливает
row_securityв значениеOFF, чтобы гарантировать полный выгрузку содержимого таблицы. Если пользователь, запускающий pg_dump, не имеет соответствующих разрешений, будет возвращена ошибка. Однако суперпользователи и владелец выгружаемой таблицы всегда обходят RLS.CONNECTION LIMITconnlimitЕсли роль может войти в систему, это определяет, сколько одновременных соединений может установить роль. Значение -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 ROLErole_nameПредложение
IN ROLEперечисляет одну или несколько существующих ролей, к которым новая роль будет немедленно добавлена в качестве нового члена. (Обратите внимание, что нет возможности добавить новую роль в качестве администратора; для этого используйте отдельную командуGRANT).IN GROUProle_nameIN GROUP- это устаревшее написание дляIN ROLE.ROLErole_nameПредложение
ROLEперечисляет одну или несколько существующих ролей, которые автоматически добавляются в качестве членов новой роли. (Это, по сути, делает новую роль “группой”).ADMINrole_nameПредложение
ADMINпохожа наROLE, но именованные роли добавляются к новой ролиWITH ADMIN OPTION, предоставляя им право назначать членство в этой роли другим пользователям.USERrole_nameПредложение
USERявляется устаревшим написанием предложенияROLE.SYSIDuidПредложение
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.