> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Des contraintes sur les paramètres peuvent être définies dans la section `profiles` du fichier de configuration `user.xml` et empêchent les utilisateurs de modifier certains paramètres à l’aide de la requête `SET`.

# Contraintes sur les paramètres

<h2 id="overview">
  Vue d’ensemble
</h2>

Dans ClickHouse, les « contraintes sur les paramètres » désignent les limitations et les règles
que vous pouvez leur définir. Ces contraintes permettent de préserver
la stabilité, la sécurité et le comportement prévisible de votre base de données.

<h2 id="defining-constraints">
  Définition des contraintes
</h2>

Les contraintes sur les paramètres peuvent être définies dans la section `profiles` du fichier de configuration `user.xml`.
Elles empêchent les utilisateurs de modifier certains paramètres à l’aide de
l’instruction [`SET`](/fr/reference/statements/set).

Les contraintes sont définies comme suit :

```xml theme={null}
<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>
      <setting_name_6>
        <min>lower_boundary</min>
        <max>upper_boundary</max>
        <disallowed>value1</disallowed>
        <disallowed>value2</disallowed>
        <disallowed>value3</disallowed>
        <changeable_in_readonly/>
      </setting_name_6>
    </constraints>
  </user_name>
</profiles>
```

Si l'utilisateur tente d'enfreindre les contraintes, une exception est levée et le
paramètre reste inchangé.

<h2 id="types-of-constraints">
  Types de contraintes
</h2>

ClickHouse prend en charge plusieurs types de contraintes :

* `min`
* `max`
* `disallowed`
* `readonly` (avec l’alias `const`)
* `changeable_in_readonly`

Les contraintes `min` et `max` définissent les bornes inférieure et supérieure d’un
paramètre numérique, et peuvent être utilisées conjointement.

La contrainte `disallowed` permet de spécifier une ou plusieurs valeurs qui ne doivent pas
être autorisées pour un paramètre donné.

La contrainte `readonly` ou `const` indique que l’utilisateur ne peut pas modifier
du tout le paramètre correspondant.

Le type de contrainte `changeable_in_readonly` permet aux utilisateurs de modifier le paramètre
dans la plage `min`/`max` même si le paramètre `readonly` est défini sur `1` ;
autrement, les paramètres ne peuvent pas être modifiés en mode `readonly=1`.

<Note>
  `changeable_in_readonly` n’est pris en charge que si `settings_constraints_replace_previous`
  est activé :

  ```xml theme={null}
  <access_control_improvements>
    <settings_constraints_replace_previous>true</settings_constraints_replace_previous>
  </access_control_improvements>
  ```
</Note>

<h3 id="readonly-changeable-in-readonly">
  Ne rendez pas `readonly` modifiable en mode lecture seule
</h3>

<Warning>
  Gardez `readonly` en dehors de la liste `changeable_in_readonly` dans chaque profil, y compris dans les profils que vous n'affectez à personne : n'importe quelle session peut sélectionner un profil par son nom.
</Warning>

Ne marquez pas `readonly` lui-même comme `changeable_in_readonly`. Si vous le faites, une session démarrée avec `readonly = 1` peut exécuter `SET readonly = 0` et retrouver ainsi la possibilité d'exécuter les requêtes d'écriture que ses privilèges existants autorisent déjà, à moins que la même contrainte n'interdise également `0`.

Ce point concerne chaque profil que vous définissez, et pas seulement ceux que vous affectez :

* `SET profile` n'est pas soumis à un contrôle d'accès : n'importe quelle session peut donc sélectionner n'importe quel profil par son nom. Un profil reste accessible même si vous ne l'affectez à personne, bien que les modifications qu'il applique restent soumises aux contraintes déjà actives dans cette session.
* En HTTP, les requêtes `GET` sont forcées à `readonly = 2` uniquement lorsque la valeur effective serait autrement `0`. Ainsi, un profil qui définit `readonly = 1` mais autorise aussi la modification de `readonly` en mode lecture seule réduit à néant cette protection, car une requête `GET` peut le repasser à `0` et écrire.

<h2 id="multiple-constraint-profiles">
  Plusieurs profils de contraintes
</h2>

S'il y a plusieurs profils actifs pour un utilisateur, les contraintes sont fusionnées.
Le processus de fusion dépend de `settings_constraints_replace_previous` :

* **true** (recommandé) : les contraintes d'un même paramètre sont remplacées lors de la
  fusion, de sorte que la dernière contrainte est utilisée et que toutes les précédentes sont ignorées.
  Cela inclut les champs non définis dans la nouvelle contrainte.
* **false** (par défaut) : les contraintes d'un même paramètre sont fusionnées de telle sorte que
  chaque type de contrainte non défini est repris du profil précédent et que chaque
  type de contrainte défini est remplacé par la valeur du nouveau profil.

<h2 id="read-only">
  Mode lecture seule
</h2>

Le mode lecture seule est activé par le paramètre `readonly`, à ne pas confondre avec le type de
contrainte `readonly`. Lorsque `readonly = 1`, un paramètre qui serait normalement refusé peut malgré tout être modifié si
une contrainte `changeable_in_readonly` l'autorise. Pour la signification des valeurs de ce paramètre, consultez la
[référence des settings](/fr/reference/settings/session-settings/other#readonly) ; pour savoir quelles classes de requête
chaque valeur autorise, et comment l'HTTP interface la définit, consultez
[les permissions pour les requêtes](/fr/concepts/features/configuration/settings/permissions-for-queries#readonly).

<h3 id="example-read-only">
  Exemple
</h3>

Supposons que `users.xml` contienne les lignes suivantes :

```xml theme={null}
<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>
```

Les requêtes suivantes renverront toutes une exception :

```sql theme={null}
SET max_memory_usage=20000000001;
SET max_memory_usage=4999999999;
SET force_index_by_date=1;
```

```text theme={null}
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.
```

<Note>
  Le profil `default` est traité de manière particulière : toutes les contraintes définies pour le
  profil `default` deviennent les contraintes par défaut et s’appliquent donc à tous les utilisateurs
  jusqu’à ce qu’elles soient explicitement remplacées pour ces utilisateurs.
</Note>

<h2 id="constraints-on-merge-tree-settings">
  Contraintes sur les paramètres de MergeTree
</h2>

Il est possible de définir des contraintes pour les [paramètres de MergeTree](/fr/reference/settings/merge-tree-settings).
Ces contraintes sont appliquées lors de la création d'une table utilisant le moteur MergeTree
ou lors de la modification de ses paramètres de stockage.

Le nom d'un paramètre de MergeTree doit être précédé du préfixe `merge_tree_` lorsqu'il est
référencé dans la section `<constraints>`.

<h3 id="example-mergetree">
  Exemple
</h3>

Vous pouvez interdire la création de nouvelles tables avec un `storage_policy` spécifié explicitement

```xml theme={null}
<profiles>
  <default>
    <constraints>
      <merge_tree_storage_policy>
        <const/>
      </merge_tree_storage_policy>
    </constraints>
  </default>
</profiles>
```
