Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Почему `SET ROLE` не сохраняется в SQL Console ClickHouse Cloud

При выполнении SET ROLE в SQL Console ClickHouse Cloud может показаться, что роль меняется для одного запроса, а для следующего возвращается к прежней. Если разрешения должны сохраняться между запросами и сеансами, используйте роль SQL Console для пользователя.

Симптомы

Возможны один или несколько из следующих симптомов:

  • После выполнения SET ROLE sql_console_developer последующие запросы по-прежнему выполняются с ролью sql_console_read_only.
  • Результаты currentRoles, enabledRoles и defaultRoles различаются от запроса к запросу.
  • При совместном выполнении SET ROLE и другого запроса выбранная роль сохраняется не всегда.
  • SHOW GRANTS выводит ожидаемые роли, но их разрешения не действуют.

Проверить текущего пользователя и роли можно с помощью:

SELECT
    currentUser(),
    currentRoles(),
    enabledRoles(),
    defaultRoles();

Почему это происходит

SQL Console отправляет запросы через HTTP-соединения без сохранения состояния в сервис ClickHouse Cloud с несколькими репликами. Не гарантируется, что последовательные запросы будут использовать одно и то же соединение или реплику.

SET ROLE изменяет роли, включенные для текущего сеанса. Это состояние сеанса не сохраняется для последующих запросов SQL Console. Поэтому последующий запрос может выполняться без роли, включенной предыдущим запросом.

Поэтому не используйте SET ROLE в качестве постоянного механизма контроля доступа в SQL Console.

Как работают роли пользователей в SQL Console

Когда пользователь открывает SQL Console, ClickHouse Cloud создаёт пользователя базы данных по следующему соглашению об именовании:

sql-console:user@example.com

ClickHouse Cloud также проверяет наличие роли базы данных, имя которой соответствует следующему соглашению:

sql-console-role:user@example.com

Когда такая роль существует, ClickHouse Cloud назначает её соответствующему пользователю SQL Console. Это поддерживаемый способ предоставить постоянные настраиваемые разрешения отдельному пользователю SQL Console.

Сущность Назначение Постоянная
sql-console:<email> Пользователь базы данных, создаваемый, когда пользователь открывает SQL Console Да, управляется ClickHouse Cloud
sql_console_admin and sql_console_read_only Встроенные роли SQL Console Да, управляется ClickHouse Cloud
sql-console-role:<email> Настраиваемая роль для отдельного пользователя, созданная администратором Да, применяется при входе пользователя

Настройка постоянных разрешений

Выполните следующие команды от имени пользователя с административными привилегиями в сервисе, например пользователя SQL Console с ролью sql_console_admin или другого пользователя с привилегией ACCESS MANAGEMENT.

Создание пользовательской роли

В следующем примере создаётся пользовательская роль sql_console_developer, которой предоставляются разрешения для my_database:

CREATE ROLE IF NOT EXISTS sql_console_developer;

GRANT SELECT, INSERT, CREATE TABLE
ON my_database.*
TO sql_console_developer;

sql_console_developer — пример роли, а не встроенная роль ClickHouse Cloud. Вместо неё можно использовать существующую пользовательскую роль с необходимыми пользователю разрешениями.

Создание роли SQL Console для пользователя

Создайте роль, имя которой содержит точный адрес электронной почты пользователя:

CREATE ROLE IF NOT EXISTS `sql-console-role:user@example.com`;

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

Предоставление пользовательской роли

Предоставьте нужную роль роли SQL Console для пользователя:

GRANT sql_console_developer
TO `sql-console-role:user@example.com`;

При необходимости можно предоставить несколько ролей:

GRANT sql_console_developer, sql_console_read_only
TO `sql-console-role:user@example.com`;

Начало нового сеанса SQL Console

Попросите пользователя выйти из SQL Console и снова войти в неё либо обновить вкладку браузера. В новом сеансе ClickHouse Cloud применяет sql-console-role:user@example.com к sql-console:user@example.com; оператор SET ROLE не требуется.

Проверьте активные роли:

SELECT
    currentUser(),
    currentRoles(),
    enabledRoles(),
    defaultRoles();

Результаты должны включать разрешения, предоставленные через sql-console-role:user@example.com.

Не изменяйте управляемые роли

Не изменяйте sql_console_admin и sql_console_read_only, чтобы назначить настраиваемые разрешения. ClickHouse Cloud управляет этими встроенными ролями. Для назначения разрешений отдельным пользователям используйте sql-console-role:<email>.

Примеры общего управления ролями см. в разделе Распространённые запросы для управления доступом.

Navigation