> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

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

<div id="symptoms">
  ## Симптомы
</div>

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

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

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

```sql theme={null}
SELECT
    currentUser(),
    currentRoles(),
    enabledRoles(),
    defaultRoles();
```

<div id="why-this-happens">
  ## Почему это происходит
</div>

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

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

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

<div id="how-sql-console-user-roles-work">
  ## Как работают роли пользователей в SQL Console
</div>

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

```text theme={null}
sql-console:user@example.com
```

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

```text theme={null}
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>`                      | Настраиваемая роль для отдельного пользователя, созданная администратором       | Да, применяется при входе пользователя |

<div id="configure-persistent-permissions">
  ## Настройка постоянных разрешений
</div>

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

<Steps>
  <Step title="Создание пользовательской роли" id="create-the-custom-role">
    В следующем примере создаётся пользовательская роль `sql_console_developer`, которой предоставляются разрешения для `my_database`:

    ```sql theme={null}
    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. Вместо неё можно использовать существующую пользовательскую роль с необходимыми пользователю разрешениями.
  </Step>

  <Step title="Создание роли SQL Console для пользователя" id="create-the-per-user-sql-console-role">
    Создайте роль, имя которой содержит точный адрес электронной почты пользователя:

    ```sql theme={null}
    CREATE ROLE IF NOT EXISTS `sql-console-role:user@example.com`;
    ```

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

  <Step title="Предоставление пользовательской роли" id="grant-the-custom-role">
    Предоставьте нужную роль роли SQL Console для пользователя:

    ```sql theme={null}
    GRANT sql_console_developer
    TO `sql-console-role:user@example.com`;
    ```

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

    ```sql theme={null}
    GRANT sql_console_developer, sql_console_read_only
    TO `sql-console-role:user@example.com`;
    ```
  </Step>

  <Step title="Начало нового сеанса SQL Console" id="start-a-new-sql-console-session">
    Попросите пользователя выйти из SQL Console и снова войти в неё либо обновить вкладку браузера. В новом сеансе ClickHouse Cloud применяет `sql-console-role:user@example.com` к `sql-console:user@example.com`; оператор `SET ROLE` не требуется.

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

    ```sql theme={null}
    SELECT
        currentUser(),
        currentRoles(),
        enabledRoles(),
        defaultRoles();
    ```

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

<div id="avoid-modifying-managed-roles">
  ## Не изменяйте управляемые роли
</div>

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

Примеры общего управления ролями см. в разделе [Распространённые запросы для управления доступом](/docs/ru/products/cloud/guides/security/cloud-access-management/common-access-management-queries).
