> ## 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.

# استعلامات شائعة لإدارة الوصول

> تشرح هذه المقالة أساسيات تعريف مستخدمي SQL والأدوار، وكيفية تطبيق هذه الامتيازات والأذونات على قواعد البيانات والجداول والصفوف والأعمدة.

<Tip>
  **ذاتي الإدارة**

  إذا كنت تعمل مع ClickHouse ذاتي الإدارة، فيُرجى الاطلاع على [مستخدمي SQL والأدوار](/docs/ar/concepts/features/security/access-rights).
</Tip>

تستعرض هذه المقالة أساسيات تعريف مستخدمي SQL والأدوار، وتطبيق هذه الامتيازات والأذونات على قواعد البيانات والجداول والصفوف والأعمدة.

<div id="admin-user">
  ## المستخدم المسؤول
</div>

تتضمن خدمات ClickHouse Cloud مستخدمًا مسؤولًا باسم `default` يُنشأ عند إنشاء الخدمة. وتُحدَّد كلمة المرور عند إنشاء الخدمة، ويمكن لمستخدمي ClickHouse Cloud الذين لديهم دور **Admin** إعادة تعيينها.

عند إضافة مستخدمين إضافيين لـ SQL إلى خدمة ClickHouse Cloud الخاصة بك، فسيحتاجون إلى اسم مستخدم وكلمة مرور لـ SQL. وإذا أردت منحهم امتيازات بمستوى إداري، فعيّن للمستخدمين الجدد الدور `default_role`. على سبيل المثال، لإضافة المستخدم `clickhouse_admin`:

```sql theme={null}
CREATE USER IF NOT EXISTS clickhouse_admin
IDENTIFIED WITH sha256_password BY 'P!@ssword42!';
```

```sql theme={null}
GRANT default_role TO clickhouse_admin;
```

<Note>
  عند استخدام SQL Console، لن تُنفَّذ عبارات SQL الخاصة بك باسم المستخدم `default`. وبدلًا من ذلك، ستُنفَّذ هذه العبارات باسم مستخدم يُسمّى `sql-console:${cloud_login_email}`، حيث يشير `cloud_login_email` إلى البريد الإلكتروني للمستخدم الذي يُشغّل الاستعلام حاليًا.

  يكون لدى مستخدمي SQL Console الذين يُنشَؤون تلقائيًا الدور `default`.
</Note>

<div id="passwordless-authentication">
  ## المصادقة بدون كلمة مرور
</div>

يتوفر دوران في SQL Console: `sql_console_admin` بأذونات مطابقة لـ `default_role`، و`sql_console_read_only` بأذونات للقراءة فقط.

يُسنَد الدور `sql_console_admin` إلى مستخدمي Admin افتراضيًا، لذا لا يتغير شيء بالنسبة إليهم. ومع ذلك، يتيح الدور `sql_console_read_only` منح المستخدمين غير المشرفين حق وصول للقراءة فقط أو حق وصول كامل إلى أي مثيل. ويجب على مستخدم Admin تهيئة هذا الوصول. ويمكن تعديل الأدوار باستخدام الأمرين `GRANT` و`REVOKE` لتلائم متطلبات كل مثيل بشكل أفضل، كما ستُحفَظ أي تعديلات تُجرى على هذه الأدوار.

<div id="granular-access-control">
  ### التحكم الدقيق في الوصول
</div>

يمكن أيضًا تهيئة وظيفة التحكم في الوصول هذه يدويًا بدقة على مستوى كل مستخدم. قبل إسناد أدوار `sql_console_*` الجديدة إلى المستخدمين، يجب إنشاء أدوار قاعدة البيانات الخاصة بمستخدمي SQL Console التي تطابق مساحة الاسم `sql-console-role:<email>`. على سبيل المثال:

```sql theme={null}
CREATE ROLE OR REPLACE sql-console-role:<email>;
GRANT <some grants> TO sql-console-role:<email>;
```

عند اكتشاف دور مطابق، سيُسنَد إلى المستخدم بدلًا من الأدوار الافتراضية الجاهزة. يتيح ذلك إعدادات أكثر تعقيدًا للتحكم في الوصول، مثل إنشاء أدوار مثل `sql_console_sa_role` و`sql_console_pm_role`، ومنحها لمستخدمين محددين. على سبيل المثال:

```sql theme={null}
CREATE ROLE OR REPLACE sql_console_sa_role;
GRANT <whatever level of access> TO sql_console_sa_role;
CREATE ROLE OR REPLACE sql_console_pm_role;
GRANT <whatever level of access> TO sql_console_pm_role;
CREATE ROLE OR REPLACE `sql-console-role:christoph@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:jake@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:zach@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:christoph@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:jake@clickhouse.com`;
GRANT sql_console_pm_role to `sql-console-role:zach@clickhouse.com`;
```

<div id="test-admin-privileges">
  ## اختبر امتيازات المسؤول
</div>

سجّل الخروج من المستخدم `default` ثم سجّل الدخول مرة أخرى باستخدام المستخدم `clickhouse_admin`.

يجب أن ينجح كل ما يلي:

```sql theme={null}
SHOW GRANTS FOR clickhouse_admin;
```

```sql theme={null}
CREATE DATABASE db1
```

```sql theme={null}
CREATE TABLE db1.table1 (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
```

```sql theme={null}
INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc');
```

```sql theme={null}
SELECT * FROM db1.table1;
```

```sql theme={null}
DROP TABLE db1.table1;
```

```sql theme={null}
DROP DATABASE db1;
```

<div id="non-admin-users">
  ## المستخدمون غير المشرفين
</div>

يجب أن يمتلك المستخدمون الامتيازات اللازمة، وألا يكونوا جميعًا من مستخدمي مسؤول. ويعرض باقي هذا المستند سيناريوهات توضيحية والأدوار المطلوبة.

<div id="preparation">
  ### التحضير
</div>

أنشئ الجداول والمستخدمين التالية لاستخدامها في الأمثلة.

<div id="creating-a-sample-database-table-and-rows">
  #### إنشاء قاعدة بيانات وجدول وصفوف تجريبية
</div>

<Steps>
  <Step title="إنشاء قاعدة بيانات اختبار" id="create-a-test-database">
    ```sql theme={null}
    CREATE DATABASE db1;
    ```
  </Step>

  <Step title="إنشاء جدول" id="create-a-table">
    ```sql theme={null}
    CREATE TABLE db1.table1 (
       id UInt64,
       column1 String,
       column2 String
    )
    ENGINE MergeTree
    ORDER BY id;
    ```
  </Step>

  <Step title="إدراج صفوف تجريبية في الجدول" id="populate">
    ```sql theme={null}
    INSERT INTO db1.table1
       (id, column1, column2)
    VALUES
       (1, 'A', 'abc'),
       (2, 'A', 'def'),
       (3, 'B', 'abc'),
       (4, 'B', 'def');
    ```
  </Step>

  <Step title="التحقق من الجدول" id="verify">
    ```sql title="استعلام" theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response title="الاستجابة" theme={null}
    Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49

    ┌─id─┬─column1─┬─column2─┐
    │  1 │ A       │ abc     │
    │  2 │ A       │ def     │
    │  3 │ B       │ abc     │
    │  4 │ B       │ def     │
    └────┴─────────┴─────────┘
    ```
  </Step>

  <Step title={<>إنشاء <code>column_user</code></>} id="create-a-user-with-restricted-access-to-columns">
    أنشئ مستخدمًا عاديًا سيُستخدم لتوضيح تقييد الوصول إلى أعمدة معيّنة:

    ```sql theme={null}
    CREATE USER column_user IDENTIFIED BY 'password';
    ```
  </Step>

  <Step title={<>إنشاء <code>row_user</code></>} id="create-a-user-with-restricted-access-to-rows-with-certain-values">
    أنشئ مستخدمًا عاديًا سيُستخدم لتوضيح تقييد الوصول إلى الصفوف ذات القيم المعيّنة:

    ```sql theme={null}
    CREATE USER row_user IDENTIFIED BY 'password';
    ```
  </Step>
</Steps>

<div id="creating-roles">
  #### إنشاء الأدوار
</div>

باستخدام هذه المجموعة من الأمثلة:

* سيتم إنشاء أدوار لامتيازات مختلفة، مثل الأعمدة والصفوف
* سيتم منح الامتيازات لهذه الأدوار
* سيتم إسناد المستخدمين إلى كل دور

تُستخدم الأدوار لتحديد مجموعات من المستخدمين ذوي امتيازات معيّنة، بدلًا من إدارة كل مستخدم على حدة.

<Steps>
  <Step title={<>أنشئ دورًا لتقييد مستخدمي هذا الدور بحيث لا يمكنهم رؤية سوى <code>column1</code> في قاعدة البيانات <code>db1</code> والجدول <code>table1</code>:</>} id="create-column-role">
    ```sql theme={null}
    CREATE ROLE column1_users;
    ```
  </Step>

  <Step title={<>اضبط الامتيازات للسماح بعرض <code>column1</code></>} id="set-column-privileges">
    ```sql theme={null}
    GRANT SELECT(id, column1) ON db1.table1 TO column1_users;
    ```
  </Step>

  <Step title={<>أضف المستخدم <code>column_user</code> إلى الدور <code>column1_users</code></>} id="add-column-user-to-role">
    ```sql theme={null}
    GRANT column1_users TO column_user;
    ```
  </Step>

  <Step title={<>أنشئ دورًا لتقييد مستخدمي هذا الدور بحيث لا يمكنهم رؤية إلا الصفوف المحددة، وفي هذه الحالة الصفوف التي تحتوي على <code>A</code> في <code>column1</code> فقط</>} id="create-row-role">
    ```sql theme={null}
    CREATE ROLE A_rows_users;
    ```
  </Step>

  <Step title={<>أضف <code>row_user</code> إلى الدور <code>A_rows_users</code></>} id="add-row-user-to-role">
    ```sql theme={null}
    GRANT A_rows_users TO row_user;
    ```
  </Step>

  <Step title={<>أنشئ سياسة للسماح بعرض الصفوف التي تكون فيها قيمة <code>column1</code> هي <code>A</code> فقط</>} id="create-row-policy">
    ```sql theme={null}
    CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users;
    ```
  </Step>

  <Step title="اضبط امتيازات قاعدة البيانات والجدول" id="set-db-table-privileges">
    ```sql theme={null}
    GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users;
    ```
  </Step>

  <Step title="امنح أذونات صريحة للأدوار الأخرى حتى تظل قادرة على الوصول إلى جميع الصفوف" id="grant-other-roles-access">
    ```sql theme={null}
    CREATE ROW POLICY allow_other_users_filter 
    ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users;
    ```

    <Note>
      عند ربط سياسة بجدول، سيطبّق النظام هذه السياسة، ولن يتمكن من تنفيذ عمليات على الجدول إلا المستخدمون والأدوار المحددون فيها، بينما سيُمنع جميع الآخرين من تنفيذ أي عمليات. ولكي لا تُطبَّق سياسة الصفوف التقييدية على المستخدمين الآخرين، يجب تعريف سياسة أخرى تسمح للمستخدمين والأدوار الآخرين بالحصول على وصول عادي أو أنواع أخرى من الوصول.
    </Note>
  </Step>
</Steps>

<div id="verification">
  ## التحقق
</div>

<div id="testing-role-privileges-with-column-restricted-user">
  ### اختبار امتيازات الدور باستخدام مستخدم مقيّد بالأعمدة
</div>

<Steps>
  <Step title={<>سجّل الدخول إلى عميل ClickHouse باستخدام المستخدم <code>clickhouse_admin</code></>} id="login-admin-user">
    ```bash theme={null}
    clickhouse-client --user clickhouse_admin --password password
    ```
  </Step>

  <Step title="تحقّق من إمكانية الوصول إلى قاعدة البيانات والجدول وجميع الصفوف باستخدام المستخدم المسؤول." id="verify-admin-access">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: f5e906ea-10c6-45b0-b649-36334902d31d

    ┌─id─┬─column1─┬─column2─┐
    │  1 │ A       │ abc     │
    │  2 │ A       │ def     │
    │  3 │ B       │ abc     │
    │  4 │ B       │ def     │
    └────┴─────────┴─────────┘
    ```
  </Step>

  <Step title={<>سجّل الدخول إلى عميل ClickHouse باستخدام المستخدم <code>column_user</code></>} id="login-column-user">
    ```bash theme={null}
    clickhouse-client --user column_user --password password
    ```
  </Step>

  <Step title={<>اختبر <code>SELECT</code> باستخدام جميع الأعمدة</>} id="test-select-all-columns">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: 5576f4eb-7450-435c-a2d6-d6b49b7c4a23

    0 rows in set. Elapsed: 0.006 sec.

    Received exception from server (version 22.3.2):
    Code: 497. DB::Exception: Received from localhost:9000. 
    DB::Exception: column_user: Not enough privileges. 
    To execute this query it's necessary to have grant 
    SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)
    ```

    <Note>
      تم رفض الوصول لأن جميع الأعمدة طُلبت، بينما يملك المستخدم حق الوصول فقط إلى `id` و`column1`
    </Note>
  </Step>

  <Step title={<>تحقّق من استعلام <code>SELECT</code> باستخدام الأعمدة المحددة والمسموح بها فقط:</>} id="verify-allowed-columns">
    ```sql theme={null}
    SELECT
        id,
        column1
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: cef9a083-d5ce-42ff-9678-f08dc60d4bb9

    ┌─id─┬─column1─┐
    │  1 │ A       │
    │  2 │ A       │
    │  3 │ B       │
    │  4 │ B       │
    └────┴─────────┘
    ```
  </Step>
</Steps>

<div id="testing-role-privileges-with-row-restricted-user">
  ### اختبار امتيازات الدور باستخدام مستخدم مقيَّد على مستوى الصفوف
</div>

<Steps>
  <Step title={<>سجّل الدخول إلى عميل ClickHouse باستخدام <code>row_user</code></>} id="login-row-user">
    ```bash theme={null}
    clickhouse-client --user row_user --password password
    ```
  </Step>

  <Step title="اعرض الصفوف المتاحة" id="view-available-rows">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb

    ┌─id─┬─column1─┬─column2─┐
    │  1 │ A       │ abc     │
    │  2 │ A       │ def     │
    └────┴─────────┴─────────┘
    ```

    <Note>
      تحقّق من أنه لا يتم إرجاع سوى الصفَّين أعلاه، ويجب استبعاد الصفوف التي تحتوي على القيمة `B` في `column1`.
    </Note>
  </Step>
</Steps>

<div id="modifying-users-and-roles">
  ## تعديل المستخدمين والأدوار
</div>

يمكن إسناد عدة أدوار إلى المستخدم للحصول على مجموعة الامتيازات المطلوبة. وعند استخدام عدة أدوار، يجمع النظام بينها لتحديد الامتيازات، بحيث تكون أذونات الأدوار في المحصلة تراكمية.

على سبيل المثال، إذا كان `role1` يتيح فقط تنفيذ SELECT على `column1` وكان `role2` يتيح تنفيذ SELECT على `column1` و`column2`، فسيكون لدى المستخدم حق الوصول إلى كلا العمودين.

<Steps>
  <Step title="باستخدام حساب مسؤول، أنشئ مستخدمًا جديدًا لتقييد الوصول حسب الصف والعمود مع أدوار افتراضية" id="create-restricted-user">
    ```sql theme={null}
    CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users;
    ```
  </Step>

  <Step title={<>أزل الامتيازات السابقة من الدور <code>A_rows_users</code></>} id="remove-prior-privileges">
    ```sql theme={null}
    REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users;
    ```
  </Step>

  <Step title={<>اسمح للدور <code>A_row_users</code> بتنفيذ SELECT على <code>column1</code> فقط</>} id="allow-column1-select">
    ```sql theme={null}
    GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users;
    ```
  </Step>

  <Step title={<>سجّل الدخول إلى عميل ClickHouse باستخدام <code>row_and_column_user</code></>} id="login-restricted-user">
    ```bash theme={null}
    clickhouse-client --user row_and_column_user --password password;
    ```
  </Step>

  <Step title="اختبر باستخدام جميع الأعمدة:" id="test-all-columns-restricted">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: 8cdf0ff5-e711-4cbe-bd28-3c02e52e8bc4

    0 rows in set. Elapsed: 0.005 sec.

    Received exception from server (version 22.3.2):
    Code: 497. DB::Exception: Received from localhost:9000. 
    DB::Exception: row_and_column_user: Not enough privileges. 
    To execute this query it's necessary to have grant 
    SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)
    ```
  </Step>

  <Step title="اختبر باستخدام الأعمدة المسموح بها فقط:" id="test-limited-columns">
    ```sql theme={null}
    SELECT
        id,
        column1
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: 5e30b490-507a-49e9-9778-8159799a6ed0

    ┌─id─┬─column1─┐
    │  1 │ A       │
    │  2 │ A       │
    └────┴─────────┘
    ```
  </Step>
</Steps>

<div id="troubleshooting">
  ## استكشاف الأخطاء وإصلاحها
</div>

قد تتداخل الامتيازات أو تجتمع أحيانًا فتؤدي إلى نتائج غير متوقعة، ويمكن استخدام الأوامر التالية لحصر المشكلة باستخدام حساب مسؤول

<div id="listing-the-grants-and-roles-for-a-user">
  ### عرض الامتيازات والأدوار الخاصة بمستخدم
</div>

```sql theme={null}
SHOW GRANTS FOR row_and_column_user
```

```response theme={null}
Query id: 6a73a3fe-2659-4aca-95c5-d012c138097b

┌─GRANTS FOR row_and_column_user───────────────────────────┐
│ GRANT A_rows_users, column1_users TO row_and_column_user │
└──────────────────────────────────────────────────────────┘
```

<div id="list-roles-in-clickhouse">
  ### عرض الأدوار في ClickHouse
</div>

```sql theme={null}
SHOW ROLES
```

```response theme={null}
Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a

┌─name────────────┐
│ A_rows_users    │
│ column1_users   │
└─────────────────┘
```

<div id="display-the-policies">
  ### عرض السياسات
</div>

```sql theme={null}
SHOW ROW POLICIES
```

```response theme={null}
Query id: f2c636e9-f955-4d79-8e80-af40ea227ebc

┌─name───────────────────────────────────┐
│ A_row_filter ON db1.table1             │
│ allow_other_users_filter ON db1.table1 │
└────────────────────────────────────────┘
```

<div id="view-how-a-policy-was-defined-and-current-privileges">
  ### الاطلاع على كيفية تعريف سياسة ما والامتيازات الحالية
</div>

```sql theme={null}
SHOW CREATE ROW POLICY A_row_filter ON db1.table1
```

```response theme={null}
Query id: 0d3b5846-95c7-4e62-9cdd-91d82b14b80b

┌─CREATE ROW POLICY A_row_filter ON db1.table1────────────────────────────────────────────────┐
│ CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
```

<div id="example-commands-to-manage-roles-policies-and-users">
  ## أوامر نموذجية لإدارة الأدوار والسياسات والمستخدمين
</div>

تُستخدم الأوامر التالية من أجل:

* حذف الامتيازات
* حذف السياسات
* إلغاء تعيين المستخدمين من الأدوار
* حذف المستخدمين والأدوار
  <br />

<Tip>
  نفّذ هذه الأوامر باستخدام مستخدم مسؤول أو المستخدم `default`
</Tip>

<div id="remove-privilege-from-a-role">
  ### سحب امتياز من دور
</div>

```sql theme={null}
REVOKE SELECT(column1, id) ON db1.table1 FROM A_rows_users;
```

<div id="delete-a-policy">
  ### حذف سياسة
</div>

```sql theme={null}
DROP ROW POLICY A_row_filter ON db1.table1;
```

<div id="unassign-a-user-from-a-role">
  ### إزالة مستخدم من دور
</div>

```sql theme={null}
REVOKE A_rows_users FROM row_user;
```

<div id="delete-a-role">
  ### حذف دور
</div>

```sql theme={null}
DROP ROLE A_rows_users;
```

<div id="delete-a-user">
  ### حذف مستخدم
</div>

```sql theme={null}
DROP USER row_user;
```

<div id="summary">
  ## الملخص
</div>

استعرضت هذه المقالة أساسيات إنشاء مستخدمي SQL والأدوار، وقدّمت خطوات لتعيين الامتيازات للمستخدمين والأدوار وتعديلها. ولمزيد من التفاصيل حول كل منها، يُرجى الرجوع إلى أدلة المستخدم والوثائق المرجعية لدينا.
