Перейти к основному содержанию
Перейти к основному содержанию

Ограничения настроек

Обзор

В ClickHouse под «ограничениями настроек» понимаются ограничения и правила, которые можно назначать этим настройкам. Эти ограничения можно применять для поддержания стабильности, безопасности и предсказуемого поведения вашей базы данных.

Определение ограничений

Ограничения для настроек можно задать в разделе profiles файла конфигурации user.xml. Они запрещают пользователям изменять некоторые настройки с помощью оператора SET.

Ограничения задаются следующим образом:

<profiles>
  <user_name>
    <constraints>
      <setting_name_1>
        <min>нижняя_граница</min>
      </setting_name_1>
      <setting_name_2>
        <max>верхняя_граница</max>
      </setting_name_2>
      <setting_name_3>
        <min>нижняя_граница</min>
        <max>верхняя_граница</max>
      </setting_name_3>
      <setting_name_4>
        <readonly/>
      </setting_name_4>
      <setting_name_5>
        <min>нижняя_граница</min>
        <max>верхняя_граница</max>
        <changeable_in_readonly/>
      </setting_name_5>
      <setting_name_6>
        <min>нижняя_граница</min>
        <max>верхняя_граница</max>
        <disallowed>значение1</disallowed>
        <disallowed>значение2</disallowed>
        <disallowed>значение3</disallowed>
        <changeable_in_readonly/>
      </setting_name_6>
    </constraints>
  </user_name>
</profiles>

Если пользователь пытается нарушить ограничения, выбрасывается исключение, а настройка остаётся без изменений.

Типы ограничений

В ClickHouse поддерживается несколько типов ограничений:

  • min
  • max
  • disallowed
  • readonly (с псевдонимом const)
  • changeable_in_readonly

Ограничения min и max задают нижнюю и верхнюю границы для числовой настройки и могут использоваться совместно.

Ограничение disallowed можно использовать для указания конкретных значений, которые являются недопустимыми для определённой настройки.

Ограничение readonly или const указывает, что пользователь не может изменять соответствующую настройку вообще.

Тип ограничения changeable_in_readonly позволяет пользователям изменять настройку в пределах диапазона min/max, даже если настройка readonly установлена в значение 1; в противном случае настройки нельзя изменять в режиме readonly=1.

Примечание

changeable_in_readonly поддерживается только если включён settings_constraints_replace_previous:

<access_control_improvements>
  <settings_constraints_replace_previous>true</settings_constraints_replace_previous>
</access_control_improvements>

Несколько профилей ограничений

Если для пользователя активно несколько профилей, ограничения объединяются. Процесс объединения зависит от settings_constraints_replace_previous:

  • true (рекомендуется): ограничения для одной и той же настройки заменяются при объединении так, что используется последнее ограничение, а все предыдущие игнорируются. Это касается также полей, которые не заданы в новом ограничении.
  • false (по умолчанию): ограничения для одной и той же настройки объединяются так, что каждый тип ограничения, который не задан, берётся из предыдущего профиля, а каждый заданный тип ограничения заменяется значением из нового профиля.

Режим только для чтения

Режим только для чтения включается настройкой readonly, которую не следует путать с типом ограничения readonly:

  • readonly=0: Нет ограничений: разрешены и чтение, и запись.
  • readonly=1: Разрешены только запросы на чтение, и настройки нельзя изменять, если только не установлен changeable_in_readonly.
  • readonly=2: Разрешены только запросы на чтение, но настройки можно изменять, за исключением самой настройки readonly.

Пример

Пусть users.xml содержит следующие строки:

<profiles>
  <default>
    <max_memory_usage>10000000000</max_memory_usage>
    <force_index_by_date>0</force_index_by_date>
    ...
    <constraints>
      <max_memory_usage>
        <min>5000000000</min>
        <max>20000000000</max>
      </max_memory_usage>
      <force_index_by_date>
        <readonly/>
      </force_index_by_date>
    </constraints>
  </default>
</profiles>

Все приведённые ниже запросы вызовут исключения:

SET max_memory_usage=20000000001;
SET max_memory_usage=4999999999;
SET force_index_by_date=1;
Code: 452, e.displayText() = DB::Exception: Значение настройки max_memory_usage не должно превышать 20000000000.
Code: 452, e.displayText() = DB::Exception: Значение настройки max_memory_usage не должно быть меньше 5000000000.
Code: 452, e.displayText() = DB::Exception: Настройка force_index_by_date не должна изменяться.
Примечание

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

Ограничения для настроек MergeTree

Можно задать ограничения для настроек MergeTree. Эти ограничения применяются при создании таблицы с движком MergeTree или при изменении её настроек хранения.

Имя настройки MergeTree должно начинаться с префикса merge_tree_ при ссылке на неё в разделе <constraints>.

Пример

Вы можете запретить создание новых таблиц, в которых явно задан storage_policy.

<profiles>
  <default>
    <constraints>
      <merge_tree_storage_policy>
        <const/>
      </merge_tree_storage_policy>
    </constraints>
  </default>
</profiles>