Skip to content

Управление ролями

Роли ClickHouse регулируют доступ к действиям внутри кластера. Например, доступ к данным, выполнение запросов и т.д.

Управлять ролями ClickHouse можно с помощью SQL-запросов. С полным списком SQL-операторов ClickHouse вы можете ознакомиться в официальной документации ClickHouse.

Посмотреть список ролей в кластере

Запросите список ролей из системной таблицы system.roles, которая содержит метаданные обо всех ролях. Для этого используйте оператор SELECT и виртуальный движок clusterAllReplicas, который выполняет запрос к указанной таблице на всех узлах всех шардов заданного кластера.

  1. Подключитесь к кластеру.

  2. Выполните запрос:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

    Будет выведен список ролей на каждом узле. Если списки ролей на каждом узле одинаковые, значит роли синхронизированы.

Посмотреть информацию о конкретной роли

Запросите из системной таблицы system.roles данные о роли по ее имени. Для просмотра используйте оператор SELECT.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    SELECT *
    FROM clusterAllReplicas('{cluster}', system.roles)
    WHERE name = '<имя роли>'
    LIMIT 1;

    Здесь условие LIMITсо значением 1 возвращает первую найденную запись из таблицы system.roles.

Создать роль

Для создания роли используйте оператор CREATE.

  1. Подключитесь к кластеру.

  2. Выполните запрос:

    sql
    CREATE ROLE [IF NOT EXISTS] <имя роли> ON CLUSTER '<имя кластера>';

    Условия в запросе:

    • IF NOT EXISTS — предотвращает ошибку, если роль с таким именем уже существует.
    • ON CLUSTER — создает роль на всех узлах заданного кластера.

Выдать привилегии роли

Для операции используйте оператор GRANT.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    GRANT <привилегия> ON <объект> TO <имя роли> ON CLUSTER '<имя кластера>';

Посмотреть привилегии роли

Для просмотра используйте оператор SHOW.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    SHOW GRANTS FOR <имя роли>;

Отозвать привилегии у роли

Для операции используйте оператор REVOKE.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    REVOKE <привилегия> ON <объект> FROM <имя роли> ON CLUSTER '<имя кластера>';

Назначить профиль настроек роли

Важно

Назначайте профиль настроек или напрямую пользователю, или только одной из его ролей. Если для пользователя действуют сразу несколько профилей, ClickHouse произвольно применит только один из них.

Для операции используйте оператор ALTER ROLE.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Узнайте имя профиля:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.settings_profiles);
  4. Выполните запрос:

    sql
    ALTER ROLE <имя роли>
    ON CLUSTER '<имя кластера>'
    SETTINGS PROFILE = '<имя профиля>';

    Все пользователи с этой ролью будут использовать указанный профиль.

    Также вы можете названить роли профиль настроек при создании профиля.

Посмотреть профиль настроек роли

Запросите информацию о профиле, назначенном роли, из системной таблицы system.roles. Для просмотра используйте оператор SELECT.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    SELECT name, settings_profile
    FROM clusterAllReplicas('{cluster}', system.roles)
    WHERE name = '<имя роли>';

    В поле settings_profile будет указано имя профиля, назначенного роли. Если профиль не назначен, поле будет пустым.

Отозвать профиль настроек у роли

Важно

После отзыва к роли будет применен профиль настроек default. Убедитесь, что его достаточно для выполнения задач.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    ALTER ROLE <имя роли>
    ON CLUSTER '<имя кластера>'
    SETTINGS PROFILE = NONE;

Настроить наследование роли

Для операции используйте оператор GRANT.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли-источника:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Узнайте имя роли-наследника:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);
  4. Выполните запрос:

    sql
    GRANT <роль-источник> TO <роль-наследник> ON CLUSTER '<имя кластера>';

    Роль-наследник будет иметь привилегии роли-источника, даже если привилегии роли-источника изменятся.

Отозвать наследование роли

Для операции используйте оператор REVOKE.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли-источника:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Узнайте имя роли-наследника:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);
  4. Выполните запрос:

    sql
    REVOKE <роль-источник> FROM <роль-наследник> ON CLUSTER '<имя кластера>';

    Роль-наследник перестанет наследовать привилегии роли-источника.

Удалить роль

Для удаления роли используйте оператор DROP.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name 
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    DROP ROLE [IF EXISTS] <имя роли> ON CLUSTER '<имя кластера>' SYNC;

    Условия в запросе:

    • IF EXISTS — предотвращает ошибку, если роли с таким именем не существует.
    • ON CLUSTER — удаляет роль на всех узлах заданного кластера.
    • SYNC — гарантирует, что команда завершится только после применения изменений на всех узлах.

    Роль удалится, а пользователи потеряют привилегии, полученные с этой ролью.