Skip to main content
يمكن تقسيم الاستعلامات في ClickHouse إلى عدة أنواع:
  1. استعلامات قراءة البيانات: SELECT, SHOW, DESCRIBE, EXISTS.
  2. استعلامات كتابة البيانات: INSERT, OPTIMIZE, DELETE, UPDATE, ALTER TABLE ... DELETE, ALTER TABLE ... UPDATE.
  3. استعلامات تغيير الإعدادات: SET, USE.
  4. استعلامات DDL: CREATE, ALTER, RENAME, EXCHANGE, ATTACH, DETACH, DROP, TRUNCATE.
  5. استعلامات إدارة الوصول: GRANT, REVOKE, وCREATE وALTER وDROP للمستخدمين والأدوار وسياسات الصفوف وسياسات الإخفاء والحصص وملفات تعريف الإعدادات. راجع التحكم في الوصول وإدارة الحسابات.
  6. KILL QUERY.
يُغيّر كل من ALTER TABLE ... DELETE وALTER TABLE ... UPDATE البيانات نفسها لا البيانات الوصفية للجدول، ولذلك أُدرجا أعلاه ضمن استعلامات كتابة البيانات. وهما يتطلبان امتيازَي ALTER DELETE وALTER UPDATE، وهما الامتيازان نفسهما اللذان تتطلبهما عبارتا DELETE وUPDATE المستقلتان. وتنتمي هذه الامتيازات إلى مجموعة امتيازات ALTER TABLE، لذا فإن allow_ddl = 0 يرفض العبارات الأربع جميعها على أي جدول دائم. تنظّم الإعدادات التالية أذونات المستخدم وفقًا لنوع الاستعلام:

readonly

يقيّد الاستعلامات التي يمكن للجلسة تنفيذها. قيم هذا الإعداد وقيمته الافتراضية والإعدادات التي تتيح كل قيمة تغييرها موصوفة في مرجع الإعدادات؛ ويصف هذا القسم فئات الاستعلامات التي تسمح بها كل قيمة. عند ضبطه على 1، يسمح باستعلامات مثل:
  • استعلامات القراءة (مثل SELECT والاستعلامات المكافئة لها).
  • الاستعلامات التي تعدّل سياق الجلسة فقط (مثل USE).
وعند ضبطه على 2، يسمح بما سبق إضافة إلى SET وCREATE TEMPORARY TABLE وRESTORE. وبما أن RESTORE يمكنه إنشاء جدول وتحميل البيانات إليه، فإن readonly = 2 لا يمنع بحد ذاته الجلسة من الكتابة، بينما يرفضها readonly = 1. أما BACKUP فلا يقيّده readonly عند أي قيمة: فالجلسة التي تملك امتيازات النسخ الاحتياطي لجدول ما يمكنها كتابة نسخة احتياطية حتى عند readonly = 1. لذا لا تعتمد على readonly لمنع النسخ الاحتياطي. تحتاج معظم دوال الجداول إلى امتياز CREATE TEMPORARY TABLE، لذا يُرفض استعلام SELECT الذي يقرأ من إحداها عند readonly = 1 دون readonly = 2. وبعضها، مثل numbers، مسموح به في وضع القراءة فقط. عند أي قيمة أكبر من 0، لا يُسمح بأي مما يلي على جدول دائم: استعلامات كتابة البيانات (INSERT وOPTIMIZE وDELETE وUPDATE وALTER TABLE ... DELETE وALTER TABLE ... UPDATE) أو استعلامات DDL (CREATE وALTER TABLE وALTER VIEW وRENAME وEXCHANGE وATTACH وDETACH وDROP وTRUNCATE TABLE). كما لا يُسمح بعبارات SYSTEM التي تتطلب امتيازًا من مجموعة SYSTEM، ولا بعمليات CREATE وALTER وDROP للمستخدمين والأدوار وسياسات الصفوف وسياسات الإخفاء والحصص وملفات تعريف الإعدادات. وتُستثنى من ذلك إدارة المجموعات المسماة، إذ لا يقيّد readonly CREATE NAMED COLLECTION ولا ALTER NAMED COLLECTION ولا DROP NAMED COLLECTION. كذلك يُرفض منح امتياز باستخدام GRANT، لكن لا ينطبق ذلك على كل عبارات إدارة الوصول: فعبارتا REVOKE المحلية وGRANT CURRENT GRANTS غير خاضعتين لـ readonly، لذا يمكن لجلسة للقراءة فقط أن تسحب امتيازًا تملكها مع خيار المنح وأن تنقل صلاحياتها إلى مستخدم آخر. أما سحب امتياز باستخدام ON CLUSTER فيُرفض. الجداول المؤقتة مستثناة من كلا الإعدادين: فالجلسة التي يمكنها إنشاء جدول مؤقت يمكنها أيضًا تنفيذ ALTER عليه، والإدراج فيه وحذفه.
عبر واجهة HTTP، يُنفَّذ الطلب الذي لا تكون طريقته POST بقيمة readonly = 2 إذا كانت القيمة الفعّالة ستكون 0 لولا ذلك. ويُحتفظ بأي قيمة أكثر صرامة سبق ضبطها عبر إعدادات المستخدم أو عبر ملف تعريف إعدادات. وتُستثنى PUT وDELETE عندما تصل إلى معالج معرّف بلغة SQL يقبلها، فيمكن لمثل هذا الطلب أن يعدّل البيانات عندما تكون قيمة readonly الفعّالة 0؛ وإلا فاستخدم طريقة POST لتعديل البيانات.وفي الطلب الذي رُفعت قيمته بهذه الطريقة، يُرفض تمرير معامل readonly في سلسلة الاستعلام برسالة Cannot modify 'readonly' setting in readonly mode ما لم يحدد القيمة التي يحملها الطلب أصلًا.توجد طريقة لمنع المستخدم من تغيير إعدادات محددة فقط، وطريقة للسماح بتغيير إعدادات محددة فقط ضمن قيود readonly = 1. لمزيد من التفاصيل راجع القيود على الإعدادات، التي تنصح كذلك بعدم جعل إعداد readonly نفسه قابلًا للتغيير في وضع القراءة فقط.

allow_ddl

يسمح باستعلامات DDL أو يمنعها على قواعد البيانات، والجداول، وطرق العرض، والقواميس، والدوال المعرّفة من قبل المستخدم، وأحمال العمل، والموارد، والمعالجات المعرّفة بلغة SQL. القيم الممكنة:
  • 0 — يُحظر تنفيذ أي استعلام على كائن دائم يحتاج إلى أي من الامتيازات التالية: CREATE DATABASE، DROP DATABASE، CREATE TABLE، CREATE VIEW، ALTER TABLE، ALTER VIEW، DROP TABLE، DROP VIEW، TRUNCATE، CREATE DICTIONARY، DROP DICTIONARY، CREATE FUNCTION، DROP FUNCTION، CREATE WORKLOAD، DROP WORKLOAD، CREATE RESOURCE، DROP RESOURCE، CREATE HANDLER، ALTER HANDLER، DROP HANDLER. وتحتاج RENAME وEXCHANGE وATTACH وDETACH إلى هذه الامتيازات أيضًا، لذا فهي محظورة كذلك، باستثناء ALTER TABLE ... ATTACH PARTITION وATTACH PART اللتين تحتاجان إلى INSERT فقط ولا يحظرهما هذا الإعداد، وإن كان readonly يحظرهما على الجدول الدائم. أما ATTACH PARTITION ... FROM فتحتاج إلى ALTER DELETE أيضًا، ولذلك فهي محظورة. ولا يشمل الحظر منح هذه الامتيازات أو سحبها.
  • 1 — لا يحظر هذا الإعداد شيئًا.
القيمة الافتراضية: 1
لا يمكنك تنفيذ SET allow_ddl = 1 إذا كانت allow_ddl = 0 في الجلسة الحالية.لا يقيّد allow_ddl استعلامات إدارة الوصول: فـ GRANT وREVOKE وCREATE وALTER وDROP للمستخدمين والأدوار وسياسات الصفوف وسياسات الإخفاء والحصص وملفات تعريف الإعدادات لا تتأثر به. كما لا تتأثر CREATE TEMPORARY TABLE وإدارة المجموعات المسمّاة، وكذلك ALTER DATABASE ... MODIFY SETTING وALTER DATABASE ... MODIFY COMMENT وUNDROP TABLE، وهي غير مقيّدة بـ readonly أيضًا. وداخل CREATE أو ALTER لمستخدم أو دور أو ملف تعريف إعدادات، تُرفض جملة SETTINGS allow_ddl = 1 ما دامت الجلسة الحالية لديها allow_ddl = 0، بينما تُقبل جملة SETTINGS allow_ddl = 0. ويجري التحقق من الإعداد المضمّن وفق قيود إعدادات الجلسة نفسها، وهذا أيضًا سبب رفض SET allow_ddl = 1.
KILL QUERYلا يتطلب إنهاء استعلاماتك الخاصة امتياز KILL QUERY، لذا فهو يعمل مع أي مزيج من readonly وallow_ddl، لكنه يتطلب SELECT على system.processes، باستثناء KILL QUERY WHERE query_id = '<id>'، الذي يلغي استعلامك الخاص الذي يحمل هذا المعرّف دون قراءة ذلك الجدول. أما إنهاء استعلام يخص مستخدمًا آخر، وأي KILL QUERY ... ON CLUSTER، فيتطلب امتياز KILL QUERY، وهو ما يرفضه readonly = 1 وreadonly = 2.

إعدادات أخرى ذات صلة

  • allow_introspection_functions هو الإعداد الثالث الذي يشارك في قرار الصلاحية نفسه، إلى جانب readonly و allow_ddl. فعند تعطيله، يُحظر تنفيذ دوال introspection، بينما لا يُحظر منح صلاحية INTROSPECTION.
  • allow_non_metadata_alters ليس إعداد صلاحيات، لكنه يفرض قيودًا إضافية على ALTER TABLE: فعند تعطيله، يُرفض أي أمر يغيّر تعريف الجدول في جداول عائلة MergeTree إذا كان تطبيقه سيؤدي إلى إعادة كتابة البيانات على القرص (DROP COLUMN، RENAME COLUMN، تغيير النوع عبر MODIFY COLUMN، MODIFY TTL). كما تُرفض CLEAR COLUMN وCLEAR INDEX وCLEAR PROJECTION، رغم أنها تترك التعريف دون تغيير. أما العبارات التي تُعدّ بحد ذاتها mutations، مثل ALTER TABLE ... DELETE وALTER TABLE ... UPDATE وALTER TABLE ... MATERIALIZE INDEX، فلا تتأثر.
آخر تعديل في ٢٦ سبتمبر ٢٠٢٦