设置约束
设置的约束可以在 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>
如果用户尝试违反约束,则会抛出异常并且设置不会更改。支持几种类型的约束:min
、max
、readonly
(带别名 const
)和 changeable_in_readonly
。min
和 max
约束指定数值设置的上限和下限,并且可以组合使用。readonly
或 const
约束指定用户根本无法更改相应的设置。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>