跳至主要内容

设置约束

设置的约束可以在 user.xml 配置文件的 profiles 部分定义,并禁止用户使用 SET 查询更改某些设置。约束定义如下:

<profiles>
<user_name>
<constraints>
<setting_name_1>
<min>lower_boundary</min>
</setting_name_1>
<setting_name_2>
<max>upper_boundary</max>
</setting_name_2>
<setting_name_3>
<min>lower_boundary</min>
<max>upper_boundary</max>
</setting_name_3>
<setting_name_4>
<readonly/>
</setting_name_4>
<setting_name_5>
<min>lower_boundary</min>
<max>upper_boundary</max>
<changeable_in_readonly/>
</setting_name_5>
</constraints>
</user_name>
</profiles>

如果用户尝试违反约束,则会抛出异常并且设置不会更改。支持几种类型的约束:minmaxreadonly(带别名 const)和 changeable_in_readonlyminmax 约束指定数值设置的上限和下限,并且可以组合使用。readonlyconst 约束指定用户根本无法更改相应的设置。changeable_in_readonly 约束类型允许用户即使 readonly 设置为 1 也可以在 min/max 范围内更改设置,否则在 readonly=1 模式下不允许更改设置。请注意,仅当启用 settings_constraints_replace_previous 时才支持 changeable_in_readonly

<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: Setting max_memory_usage should not be greater than 20000000000.
Code: 452, e.displayText() = DB::Exception: Setting max_memory_usage should not be less than 5000000000.
Code: 452, e.displayText() = DB::Exception: Setting force_index_by_date should not be changed.

注意:default 配置文件具有特殊处理:为 default 配置文件定义的所有约束都成为默认约束,因此它们会限制所有用户,直到为这些用户明确覆盖它们为止。

Merge Tree 设置约束

可以为Merge Tree 设置设置约束。在创建具有 Merge Tree 引擎的表或更改其存储设置时,将应用这些约束。在 <constraints> 部分引用 Merge Tree 设置的名称时,必须以 merge_tree_ 前缀开头。

示例:禁止创建具有显式指定的 storage_policy 的新表

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