> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> يمكن تعريف القيود على الإعدادات في قسم `ملف التعريف` ضمن ملف الإعدادات `user.xml`، وهي تمنع المستخدمين من تغيير بعض الإعدادات باستخدام الاستعلام `SET`.

# القيود على الإعدادات

<div id="overview">
  ## نظرة عامة
</div>

في ClickHouse، تشير "القيود" المفروضة على الإعدادات إلى الحدود والقواعد التي
يمكنك تعيينها للإعدادات. ويمكن تطبيق هذه القيود للحفاظ على
الاستقرار والأمان وسهولة التنبؤ بسلوك قاعدة البيانات.

<div id="defining-constraints">
  ## تعريف القيود
</div>

يمكن تعريف القيود على الإعدادات في قسم `ملف التعريف` ضمن ملف الإعداد `user.xml`.
وهي تمنع المستخدمين من تغيير بعض الإعدادات باستخدام تعليمة
[`SET`](/docs/ar/reference/statements/set).

تُعرَّف القيود على النحو التالي:

```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>
```

إذا حاول المستخدم انتهاك القيود، فسيُطلَق استثناء ويظل
الإعداد دون تغيير.

<div id="types-of-constraints">
  ## أنواع القيود
</div>

هناك عدة أنواع من القيود التي يدعمها ClickHouse:

* `min`
* `max`
* `disallowed`
* `readonly` (بالاسم المستعار `const`)
* `changeable_in_readonly`

يحدّد القيدان `min` و`max` الحدين الأدنى والأقصى لإعداد رقمي،
ويمكن استخدامهما معًا.

يمكن استخدام القيد `disallowed` لتحديد قيمة أو قيم معيّنة
لا ينبغي السماح بها لإعداد محدد.

ينصّ القيد `readonly` أو `const` على أن المستخدم لا يمكنه تغيير
الإعداد المقابل مطلقًا.

يتيح نوع القيد `changeable_in_readonly` للمستخدمين تغيير الإعداد
ضمن نطاق `min`/`max` حتى إذا كان الإعداد `readonly` مضبوطًا على `1`،
وإلا فلن يُسمح بتغيير الإعدادات في وضع `readonly=1`.

<Note>
  لا يكون `changeable_in_readonly` مدعومًا إلا إذا كان `settings_constraints_replace_previous`
  مفعّلًا:

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

<div id="multiple-constraint-profiles">
  ## ملفات تعريف القيود المتعددة
</div>

إذا كان هناك عدة ملفات تعريف نشطة لمستخدم، فستُدمَج القيود.
تعتمد عملية الدمج على `settings_constraints_replace_previous`:

* **true** (موصى به): تُستبدَل القيود الخاصة بالإعداد نفسه أثناء
  الدمج، بحيث يُستخدَم القيد الأخير وتُتجاهَل جميع القيود السابقة.
  ويشمل ذلك الحقول غير المعيّنة في القيد الجديد.
* **false** (افتراضي): تُدمَج القيود الخاصة بالإعداد نفسه بطريقة
  يُؤخَذ فيها كل نوع من القيود غير المعيّنة من ملف التعريف السابق، ويُستبدَل كل
  نوع من القيود المعيّنة بالقيمة من ملف التعريف الجديد.

<div id="read-only">
  ## وضع القراءة فقط
</div>

يتم تفعيل وضع القراءة فقط بواسطة الإعداد `readonly`، ويجب عدم الخلط بينه
وبين نوع القيد `readonly`:

* `readonly=0`: لا توجد أي قيود على وضع القراءة فقط.
* `readonly=1`: يُسمح فقط باستعلامات القراءة، ولا يمكن تغيير الإعدادات
  إلا إذا كان `changeable_in_readonly` مُعيَّنًا.
* `readonly=2`: يُسمح فقط باستعلامات القراءة، لكن يمكن تغيير الإعدادات،
  باستثناء الإعداد `readonly` نفسه.

<div id="example-read-only">
  ### مثال
</div>

ليتضمّن الملف `users.xml` الأسطر التالية:

```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>
```

ستُرجِع جميع الاستعلامات التالية استثناءات:

```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>
  يُتعامل مع ملف التعريف `default` على نحوٍ خاص: إذ تصبح جميع القيود المعرّفة
  لملف التعريف `default` هي القيود الافتراضية، وبالتالي تُطبَّق على جميع المستخدمين
  ما لم يُتجاوز عنها صراحةً لهؤلاء المستخدمين.
</Note>

<div id="constraints-on-merge-tree-settings">
  ## قيود على إعدادات MergeTree
</div>

يمكن فرض قيود على [إعدادات MergeTree](/docs/ar/reference/settings/merge-tree-settings).
تُطبَّق هذه القيود عند إنشاء جدول يستخدم محرك MergeTree
أو عند تعديل إعدادات التخزين الخاصة به.

يجب أن يُسبق اسم إعداد MergeTree بالبادئة `merge_tree_` عند
الإشارة إليه في قسم `<constraints>`.

<div id="example-read-only">
  ### مثال
</div>

يمكنك منع إنشاء جداول جديدة مع تحديد `storage_policy` صراحةً

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